Bzoj1045:[HAOI2008] 糖果传递

题目链接
题意很清晰了。。
做法大概是求出每个人需要或者多余的数量,再转成前缀和,排一下序找出中位数,答案就是每个数与中位数的距离和了。。
证明也很容易看懂,只是真正拿到题目的时候怎么思考? Orz会数学的大神求指点。。。
【Code】
var
  i:longint;
  k,n,ans,ave:int64;//小小的坑点,要注意数据范围。。
  a:array[0..10000000]of int64;
  sum:Array[0..10000000]of int64;
procedure qsort(l,r:longint);
var i,j,t,mid:longint;
begin
  i:=l;j:=r; mid:=sum[(i+j)div 2];
  repeat
    while sum[i]
    while sum[j]>mid do dec(j);
    if i<=j then begin
      t:=sum[i];sum[i]:=sum[j];sum[j]:=t;
      inc(i);dec(j);
    end;
  until i>j;
  if l
  if i
end;
begin
  readln(n);
  sum[0]:=0;
  for i:=1 to n do begin
    readln(a[i]);
    sum[i]:=sum[i-1]+a[i];
  end;
  ave:=sum[n] div n;
  for i:=1 to n do
    sum[i]:=sum[i]-i*ave;
  qsort(1,n);
  ans:=0;
  k:=sum[(n+1)div 2];
  for i:=1 to n do
    ans:=ans+abs(sum[i]-k);
  writeln(ans);
end.

posted @ 2015-07-15 16:54  Vincent_hwh  阅读(104)  评论(0编辑  收藏  举报