帮助贝丝逃离沙漠


11

与其他载水难题类似,此挑战的独特方面使其完全不同。

贝丝

贝丝位于沙漠中的一片绿洲。湖中有大量的水,但不幸的是只有X个水桶,每个水桶的水容量为Y升。

贝丝可以手里拿着2个水桶,但要生存,她每行驶一公里必须喝1升水。她还可以在中途留下一些水桶(水不会蒸发)。

挑战

找出公式,并写出最短的解决方案,该解决方案适用于X和Y的正整数值,并计算Beth可以从绿洲经过的最大距离。允许在桶之间移动水。

X = 3,Y = 5

  1. 贝丝(Beth)从绿洲离开1个完整的桶3KM,然后返回(有绿洲的最后一杯饮料)
  2. 贝丝(Beth)在3KM点带来了另一个满满的铲斗,现在那里有12L。
  3. 贝丝可以前进到6公里,并在桶中放4升水。
  4. 回到3KM点。她现在只有2升水可以回到绿洲。
  5. 加满水桶,行驶至6KM点。她现在有8升水。
  6. 一直到15KM点。

答案是:15

输入输出

您可以直接在代码中定义X / Y或从输入中读取。结果可以放在变量或输出中,以最短者为准。


2
这应该是代码高尔夫吗?它被标记为代码挑战。
丹尼斯

是的,它是代码高尔夫球,我添加了标签。提出正确的公式,并通过代码进行表达。
romaninsh

1
我认为值得在第1步进行扩展。起初我还不清楚贝丝如何仅用5升水就能行驶6公里:她每行驶1公里就喝一次,而在最后一次到达绿洲时才喝。
xnor

1
您能否以程序输出的方式给出测试用例?
Pavel

编辑了问题以解决这两点。
romaninsh

Answers:


2

JavaScript(ES6),25个字节

x=>y=>((x<3?x:3)+x)*y/2+1
x=>y=>(x<3?x+x:x+3)*y/2+1
x=>y=>(x<3?x:(x+3)/2)*y+1
x=>y=>(x<3?x:x/2+1.5)*y+1

所有这些都计算出相同的值。我似乎无法提出一个简短的表述。

x小于时3,您将尽可能多地喝水,然后尽可能走远,这很简单x*y+1

x至少为3,你必须开始建立缓存。

从绿洲,您可以将一个完整的水桶保持一定距离,y/2然后返回绿洲。您需要2个存储桶来执行此操作,但是如果您只有2个存储桶,这将无用,因为您希望能够在返回绿洲时填充2个存储桶。

从绿洲(相距一个桶)y/2,您可以将一个完整的水桶保持一定距离,y然后返回绿洲。您需要3个存储桶才能执行此操作。

从绿洲,同时在y和处都有完整的存储桶y/2,您可以将完整的存储桶保持一定距离,3y/2然后返回绿洲。您需要4个存储桶来执行此操作。然后,您必须离开一个完整的桶,并保持距离,y/2然后回到绿洲。

最终,您可以在处得到一个满满的水桶(x-1)y/2。(您不能将完整的存储桶留在处,xy/2因为您将无法回到绿洲,因为往返行程是xy存储桶的总容量。)

使用剩余的存储段,您可以将完整的存储段保留在(x-3)y/2... yy/2。此时,您只需走到尽可能远的距离,就可以拿起满满的水桶。到达时,(x-1)y/2您还有两个完整的存储桶,可以到达(x+3)y/2

额外的费用1来自规则中的怪异之处,使您无需喝水就能走到最后一英里。尽管该示例显示您可以将水桶放置在比上述位置稍远的地方,但这实际上并不能帮助您走得更远,因为在移动之前,您必须丢下更少的水或喝水直到桶中的水上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.