题意/Description:
熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。
奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到奶牛B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。
读入/Input:
第一行一个整数N,表示有N只奶牛。(2<=N<=100000)。
接下来2~N+1行,第i行有一个数,表示第i-1头奶牛顺时针到第i头奶牛的距离。(1<=距离<=maxlongint,距离和<=maxlongint)
第N+1行的数表示第N头奶牛顺时针到第1头奶牛的距离。
输出/Output:
一行,表示最大距离。
题解/solution:
听LZH说,算出前缀和,二分就行了。我急脳(niao),下了。
代码/Code:
var
sum:array [0..200001] of longint;
n,max,min:longint;
procedure init;
var
i,c:longint;
begin
readln(n);
for i:=2 to n+1 do
begin
readln(c);
sum[i]:=sum[i-1]+c;
end;
for i:=n+2 to 2*n do
sum[i]:=sum[n+1]+sum[i-n];
max:=0;
end;
procedure main;
var
i,l,r,mid,t,k,minn:longint;
begin
for i:=1 to n do
begin
l:=i; r:=n+i;
min:=maxlongint;
while l<=r do
begin
mid:=(l+r) shr 1;
t:=sum[mid]-sum[i];
k:=sum[n+i]-sum[mid];
if abs(t-k)<min then
begin
min:=abs(t-k);
if t<k then minn:=t else minn:=k;
if minn>max then max:=minn;
end;
if l=mid then break;
if t<k then l:=mid else r:=mid;
end;
t:=sum[r]-sum[i];
k:=sum[n+i]-sum[r];
if abs(t-k)<min then
begin
min:=abs(t-k);
if t<k then minn:=t else minn:=k;
if minn>max then max:=minn;
end;
end;
end;
begin
init;
main;
writeln(max);
end.