题目:
你有一个大小为𝑆的史莱姆,每次你可以从你已有的史莱姆中选择一个大小不为1的史莱姆,设他的大小为k,然后把它分裂成𝑎和k−𝑎,其中1≤𝑎<k,这样你获得的收益是𝑎∗(k−𝑎)给定𝑆,𝑀,求最少分裂几次才能得到至少𝑀的收益,如果无法达到输出-1
样例:
输入:333 43434
输出:4
思路:
看到𝑎∗(k−𝑎),我就想到均分相乘最大,由于数学功底有限不能证明但是确实是这样,无论分几次都希望他分的均匀。逐次计算均分a份获得的收益,当达到目标为止。
代码如下:
list1 = list(map(int,input().split()))
a = 1#a是分裂的次数
z = 0
if list1[0]<2:
print(-1)
while z < list1[1]:#只要收益达不到要求就循环
list2 = []
z = 0
b = list1[0]//(a+1)#分的均匀就是等分
c = list1[0]%(a+1)#等分剩的余数,均匀的个前面几个数加1
for i in range(a+1):
list2.append(b)
for i2 in range(c):
list2[i2] = list2[i2]+1
for i3 in range(a):
#这一步(2222),算(2*2)再算((2+2)*2)再到((2+2+2)*2)
d = list2[0]*list2[1]
z = z + d#算收益
e = list2[0]+list2[1]
list2.pop(0)
list2.pop(0)
list2.insert(0,e)
a = a +1
if a == list1[0]:
print(-1)
break
if a<list1[0]:
print(a -1)#第a-1次已经达到,但是循环最后a+1,所以从a-1变成a,这时循环才结束,所以输出应该-1