回 帖 发 新 帖 刷新版面

主题:巧断金链

问题描述:一位聪明的商人走南闯北跑生意,有一天他来到一个小客栈投宿,准备住6天,由于刚支付一笔货物的订金,商人花光了所有的现银,身边只剩下一条他喜爱的金链,共6节,投宿客栈一天的费用恰好值一节金链。店老板有一条古怪的规定:当天的费用必须当天结清,不许拖欠也不许预支。如果商人将6节金链全部割断,每天给店主一节就可以满足这条古怪的规定,但这样6节金链都被损坏了。于是商人想了一个办法,将金链分成长度分别为1、2、3节的3段,既满足了店主的要求,也使金链受损最小。下图是商人聪明的分法: 
你的任务是写一个程序,假定商人有一根N节的金链,需投宿N天,计算最少将金链分割成几段,才能满足店主古怪的要求。 
输入:输入文件为G.in,只有一行一个正整数N(1≤N≤10000)。 
输出:输出文件为G.out,只有一行,输出应该切成的段数。 
输入输出样例: 
输入样例     输出样例 
6     3 

回复列表 (共10个回复)

沙发

给出算法

板凳

6节的金链只要把中间的那节打开,就能分成1,2,3三段各1,2,3节的金链了,
第二天,商人拿着两节金链,付第二天的房费,并要求房东找零的时候,
房东说:昨天那节金链送二奶去了,没得找……那可怎么办……?

反正都是当钱付给人家的,管它损坏不损坏的?
你要是说金链很难弄断,怎样才能最省力气那还说得过去。
(金链那么软,随便一扭都断了。)

现在出题的人脑袋都不知道哪去了。

3 楼

moz大哥,别开玩笑啦~~(其实还在笑),损坏金链最小,应该怎么想呢?

4 楼

应该挺简单的嘛
商人住N天,金链有N节
商人在第i天使用的金链的节数,是前i-1天使用的金链节数之和。
只需满足1+2+3+6+12++24+...=N ,其中加数的个数就是要分成的断数。

5 楼

算法:
(1)假设第1段是1个,第2段是2个,第3段是4个……第D段是2^(D-1)个,此时剩下的金链节数小于2^D,这个时候已经不能在截一段了,于是把它单独分成一段.
CLS
INPUT n
i = 1
DO
  k = k + 1: n = n - i: i = i * 2
LOOP UNTIL n < i
IF n = 0 THEN PRINT k ELSE PRINT k + 1
END
也要加分!!!

6 楼

哦,还有一点,也非常重要
我上面讲的 N 是指为偶数时

下面讲一下 N 为奇数
此时满足1+2+3+6+12++24+...=N-1 就可以了,这样截的话,最后会剩下最后一节金链,所以N为奇数时,有两段 1 节的金链

OK.

7 楼

我没戴过金链,不知道一节是怎么个概念。
是不是六个环,把中间的一个环打开了,就能拆成三段的这个意思?

456楼的想法的方向大致正确
不过你可以想想这样子是不是更好?
1,2,4,8,16,32,64,128,.....

8 楼

我是来赞一下6楼的签名的,不过别带坏小孩子哦。

9 楼

一般来说:
魔由心生....

10 楼

我支持7楼的想法,这是一个天然的翻倍数列,前N位数的和再加1,正好等于第N+1位的数值.

我来回复

您尚未登录,请登录后再回复。点此登录或注册