2021 年百度之星·程序设计大赛 - 初赛二

1004

题意:给出数列a,数x初始为0,依次加a_1, a_2, a_3 ... a_n,当x<0时x变为0,不断对x进行操作,问第一次x\geq m在第几轮,或判断无法满足。

如果没有将小于0的x变为0这一操作,答案很容易求,并且有一个很明显的感觉,当x一轮一轮不断变大时,x<0情况的出现次数会越来越少,直至不会出现。我们沿着这个方向思考

我们先模拟一下操作

令b为a的前缀和,那么第一幅图为b的图像,这不是最终结果,他没有改变小于0的x

那么考虑每次把负的x提到0,都加上了一个数,如图中的红色所示,我们将他们都移到第一个图(黄色部分),就可以清晰地发现,这一轮内加上的数即为b_i的最小值(准确来说是最小值的相反数)。一轮操作后,x变为b_n-min{b_i}(图中绿色部分)

一轮操作后,我们要考虑b_n的正负性了,至于原因可以看一下分析

对于b_n>0,在第二轮,x初始为b_n-min{b_i},如图:

 b整体上升了x,也就是绿色和粉色部分,此时,可以清晰地看出b整体都在0的上方,不会出现小于0的情况,并且每轮都在递增,因此不用考虑x<0的情况,最大值也没有上限。

对于b_n=0,如图:

 

 经过一轮后,与b_n >0的情况相同,整体在0的上方,但是我们要注意,此时x每一轮的最大值限定在了红线处,不会再增加

 对于b_n<0,如图:

 经过第一轮,仍然还是有一部分在0以下,因此,和b_n=0一样,最大值上限在红线部分

至此,我们可以知道,当b_n>0时,暴力求解第一轮后,可以通过找规律得到答案,而对于b_n \leq 0,后面所有轮次都和第二轮相同,因此暴力求解前二轮即可。

找规律的具体方法:先暴力求解第一轮(如果已经达到m输出1),得到第二轮的初始值x,一轮会增加b_n,再得到每轮达到最大值为mx,考虑m一定是由x加上一些b_n再加上mx,答案为(m-mx-x+b_n-1)/b_n(需要取整)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值