bzoj1122

题意:
一个长度为n的记账单,+表示存¥1,-表示取¥1。现在发现记账单有问题。一开始本来已经存了¥p,并且知道最后账户上还有¥q。你要把记账单修改正确,使得 1:账户永远不会出现负数; 2:最后账户上还有¥q。你有2种操作: 1:对某一位取反,耗时x; 2:把最后一位移到第一位,耗时y。

题解:
很容易知道1操作数量是一定的,设+的数量为np,-的数量为nm,可以计算出需要将(p - q + np - nm) / (-2)个-变成+。这样以后,好像不知道怎么去进行操作2,这个好像不能贪心?

直接枚举!
需要预处理 fnti 表示前i个的前缀和最小值, baci 表示后i个的前缀和最小值,然后枚举将i-n位前移,整个序列的前缀和最小值就变成:
       t1=min(snsi1+fnti1,bacisi1)
为了保证每一处前缀和不为负,需要将一部分的-变成+。
可以知道如要将+变成-,则应该将最后的+号变成-,这样结果一定最优。
所以考虑将前面的一个-换成+,同时在后面将一个+换成-,需要换多少个?
因为一个-变成+,就可以让总和增加2,所以:
       t2=(pt1+1)/2+(turn>0?turn:0)
然后总的代价就可以算出来了……
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值