CF1419C Killjoy

知识点:贪心

题目链接

题意

给定一个数字、一个序列和一个操作:选择任意一个子序列,增加或减少子序列的任意元素,使得 ∑ Δ x i = 0 \sum \Delta x_i=0 Δxi=0 Δ x i \Delta x_i Δxi为第i个元素的变化量。
每次操作开始之前,与给定数字相同或与染色数字相同的元素会被染色。求最少的操作次数使得所有元素被染色(全染色之后的操作不计入次数)。

思路

本题的操作自由度比较大,想思路时应尽量多讨论几种情况以免漏解。
可知操作次数不超过2。考虑到操作时序列和不变,求出序列和,发现序列和sum可表示为 s u m = ⌊ s u m / n ⌋ × n + s u m % n sum=\lfloor sum/n \rfloor\times n +sum\%n sum=sum/n×n+sum%n(n为元素个数),即n个都为 ⌊ s u m / n ⌋ \lfloor sum/n \rfloor sum/n的数字和 s u m % n < n sum\%n<n sum%n<n个1,把 s u m % n sum\%n sum%n个1加到 s u m % n sum\%n sum%n ⌊ s u m / n ⌋ \lfloor sum/n \rfloor sum/n中,发现对任意sum都能按照相等分成两组。
所以从小到大考虑操作次数。显然元素全为给定数字x的时候操作次数为0,没有其他情况
考虑1次,如果 x × n = s u m x\times n=sum x×n=sum,即一次操作就能把元素变成第一种情况。如果有一个元素等于x,那么这个数没有限制,没染色的数要变成第一种情况,只需要把多余的数加到那一个染色的数上即可。没有其他情况
其他情况为2次。
代码根据思路即可实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值