圆周舞蹈 (Standard IO)

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



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值