圆周舞蹈 (Standard IO)

来源:互联网 发布:网络经费分析 编辑:程序博客网 时间:2024/04/27 19:18

题意/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.


4 0
原创粉丝点击