题目
=有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
题解
贪心。
把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0。如果张数中本来就有为0的,如0,-1,-5,6,还是从左算起(从右算起也完全一样),第1堆是0,无需移牌,余下与上相同;再比如-1,-2,3,10,-4,-6,从左算起,第1次移动的结果为0,-3,3,10,-4,-6;第2次移动的结果为0,0,0,10,-4,-6,现在第3堆已经变为0了,可节省1步,余下继续。
时间复杂度O(n)
代码
var
n,i,j,k,ans:longint;
a:array[1..100]of longint;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);
j:=j+a[i];
end;
j:=j div n;
for i:=1 to n do a[i]:=a[i]-j;
for i:=1 to n-1 do
if a[i]<>0 then
begin
a[i+1]:=a[i+1]+a[i];
a[i]:=0;
inc(ans);
end;
writeln(ans);
end.