旅行者需要在城外的一家酒店住宿n天。他没有现金了,他的信用卡已过期。但是他有一个带有n个链接的金链。
这家酒店的规定是居民应每天早晨支付租金。旅行者与经理达成协议,每天支付金链的一个链接。但是经理还要求旅行者在每天付款时,对链条的损坏应尽可能少。换句话说,他必须提出一种解决方案,以减少尽可能少的链接。
剪切链接将创建三个子链:一个仅包含剪切链接的子链,而在每一侧各包含一个。例如,剪切长度为8的链的第三个链接将创建长度为[2,1,5]的子链。经理很高兴进行更改,因此旅行者可以在第一天使用长度为1的链条进行支付,然后在第二天使用长度为2的链条进行支付,从而收回第一条链条。
您的代码应输入长度n,并输出链接列表以切出最小长度。
规则:
- n是大于0的整数。
- 您可以对链接使用基于0或基于1的索引。
- 对于某些数字,解决方案不是唯一的。例如,如果
n = 15
两个[3, 8]
和[4, 8]
是有效的输出。 - 您可以返回列表,也可以使用任何合理的分隔符进行打印。
- 这是code-golf,因此以字节为单位的最短代码获胜。
测试用例:
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
详细的例子
对于n = 15,剪切链接3和8会得到length的子链[2, 1, 4, 1, 7]
。这是一个有效的解决方案,因为:
1 = 1
2 = 2
3 = 1+2
4 = 4
5 = 1+4
6 = 2+4
7 = 7
8 = 1+7
9 = 2+7
10 = 1+2+7
11 = 4+7
12 = 1+4+7
13 = 2+4+7
14 = 1+2+4+7
15 = 1+1+2+4+7
没有一个解决方案,只有一个切口,因此这是一个最佳解决方案。
附录
请注意,此问题与整数分区有关。我们正在寻找n的分区P,以使从1到n的所有整数都至少具有一个子集,该子集是 P。
这是一个有关该问题的可能算法的YouTube视频。
1+2
。第二条2链从何而来?