圆周舞蹈 (Standard IO)

Description
  熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。

  奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到奶牛B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。


题解:

  用前缀和将环一分为二,再枚举答案。

代码:

var
  a:array[0..500000] of longint;
  n,min,max:longint;
procedure init;
var
  i,s:longint;
begin
  readln(n);
  for i:=2 to n+1 do
    begin
      readln(s);
      a[i]:=a[i-1]+s;
    end;
  for i:=n+2 to 2*n do
    a[i]:=a[n+1]+a[i-n];
end;
procedure main;
var
  i,l,r,mid,x,y,s:longint;
begin
  for i:=1 to n do
    begin
      l:=i;r:=n+i;
      min:=maxlongint;
      while l<=r do
        begin
          mid:=(l+r) div 2;
          x:=a[mid]-a[i];
          y:=a[n+i]-a[mid];
          if abs(x-y)<mid then
            begin
              mid:=abs(x-y);
              if x<y then
                s:=x
              else s:=y;
              if s>max then max:=s;
            end;
          if l=mid then break;
          if x<y then
            l:=mid
          else r:=mid;
        end;
      x:=a[r]-a[i];
      y:=a[n+i]-a[r];
      if  abs(x-y)<min then
        begin
          min:=abs(x-y);
          if  x<y then
            s:=x
          else
            s:=y;
          if s>max then max:=s;
        end;
    end;
end;
begin
  init;
  main;
end.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值