知识点:贪心
题意
给定一个数字、一个序列和一个操作:选择任意一个子序列,增加或减少子序列的任意元素,使得
∑
Δ
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次。
代码根据思路即可实现。