招行2021提前批史莱姆分裂(python)

题目:
你有一个大小为𝑆的史莱姆,每次你可以从你已有的史莱姆中选择一个大小不为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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值