圆周舞蹈

  熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。
  奶牛想知道两只最远的奶牛到底隔了多远。奶牛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

  一行,表示最大距离。

Sample Input

5

1

2

3

4

5

Sample Output

7

 

先预处理出1号点到任意一点的顺时针处理一遍,转两圈(更好地二分)。每次用二分求出离任意1个点(A)比较远的两个个点,即B,C。如果一个点的顺时针和逆时针的差越小,就越接近离A最远的点,二分即可。不过退出二分后把点B或点C再搜一遍即可。



 

var

 sum:Array [0..200010] of longint;

 n,i,l,r,x,mid,y,max,min,he:longint;

 

begin

 readln(n);

  fori:=2 to n+1 do

  begin

   readln(x);

   sum[i]:=sum[i-1]+x;

  end;

  fori:=n+2 to 2*n do

  sum[i]:=sum[n+1]+sum[i-n];

 max:=0;

  fori:=1 to n do

  begin

   l:=i; r:=n+i;

   min:=maxlongint;

   while l<=r do

    begin

     mid:=(l+r) shr 1;

     x:=sum[mid]-sum[i];

     y:=sum[n+i]-sum[mid];

     if abs(x-y)<min then

     begin

      min:=abs(x-y);

      if x<y then he:=x else he:=y;

      if he>max then max:=he;

     end;

     if l=mid then break;

     if x<y then l:=mid else r:=mid;

    end;

   x:=sum[r]-sum[i];

   y:=sum[n+i]-sum[r];

   if abs(x-y)<min then

   begin

    min:=abs(x-y);

     if x<y then he:=x else he:=y;

    if he>max then max:=he;

   end;

  end;

 writeln(max);

end.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值