[模拟][NOIP2002] 均分纸牌

NOIP2002 均分纸牌

时间限制: 1 Sec 内存限制: 128 MB

题目描述

  • 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
      移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
      现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
      例如 N=4,4 堆纸牌数分别为:
      ① 9 ② 8 ③ 17 ④ 6
      移动3次可达到目的:
      从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

输入

  • N(N 堆纸牌,1 <= N <= 100)A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)

输出

  • 所有堆均达到相等时的最少移动次数。

样例输入

  • 4
    9 8 17 6

样例输出

  • 3
var
 n,sum,ans:longint;
 i,j,k:longint;
 x:array[1..100]of longint;
begin readln(n);
 for i:=1 to n do begin read(x[i]);
   inc(sum,x[i]);
  end;
 sum:=sum div n;
 for i:=1 to n do if x[i]=sum then continue else if x[i]<sum then begin inc(ans);
     dec(x[i+1],sum-x[i]);
     x[i]:=sum;
    end else begin inc(ans);
     inc(x[i+1],x[i]-sum);
     x[i]:=sum;
    end;
 writeln(ans);
end.

你可能感兴趣的:([模拟][NOIP2002] 均分纸牌)