DTOJ 3999: 游戏(game)

题意

这个游戏是这样的,你有一个初始序列 S S S ,你每次可以选择一段任意长度的连续区间,把他们 + 1 +1 +1 再膜 k k k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列。作为一名优秀的OIer,您认为这个游戏十分naive,所以您打算撸一个游戏脚本来取到最优解。
n ≤ 1 e 5 , k ≤ 100 n\le1e5,k\le100 n1e5,k100

题解

因为是区间 + 1 +1 +1问题,又要使次数最少,故考虑差分。记 a i a_i ai为原数经过多少次可变成目标数, b i b_i bi差分数组。若不考虑取模,则贪心地算,答案为 ∑   m a x ( b i , 0 ) \sum\ max(b_i,0)  max(bi,0)
那么考虑取模的影响,就是将一段区间加 k k k次后结果不变,即将 b l + k , b r − k b_l+k,b_r-k bl+k,brk后仍然满足。考虑贪心地执行一系列这样的操作,使答案最小。发现只有 b l < 0 b_l<0 bl<0时加 k k k才可能减小答案(若 b l > 0 b_l>0 bl>0,则会对答案增加 k k k,而对后面不可能减少 k k k),而当 b r > 0 b_r>0 br>0时才能减 k k k(否则无用)。而一个加与一个减要一一对应,故将加的存进桶中,对于减的,在桶中查询能最大程度减少答案的值,然后再把本来的 b i b_i bi放入桶中,因为这样的操作不一定最优,放入桶中相当于给后面的一次反悔的机会,这样答案就最优了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值