Bzoj1045:[HAOI2008] 糖果传递
题目链接
i:longint;
k,n,ans,ave:int64;//小小的坑点,要注意数据范围。。
a:array[0..10000000]of int64;
sum:Array[0..10000000]of int64;
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
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);
题意很清晰了。。
做法大概是求出每个人需要或者多余的数量,再转成前缀和,排一下序找出中位数,答案就是每个数与中位数的距离和了。。
证明也很容易看懂,只是真正拿到题目的时候怎么思考? Orz会数学的大神求指点。。。
【Code】
var
procedure
qsort(l,r:longint);
var
i,j,t,mid:longint;
begin
end;
begin
end.