圆周舞蹈 题解

题目描述

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

  一行,表示最大距离。

Sample Input

5

1

2

3

4

5

Sample Output

7

思路:

我们可以发现,这组成了一个环

然后

再然后

再再然后
再再再然后
就往下搜

当I(头)为1时,我们往下搜,直到范围内的总和大于 TOT/2(环的总值的一半)。

曾经有一个叫王CL的人问我为什么要大于 TOT/2就退出,我说:没为什么,就是当值大于 TOT/2时,从另一方向就会更优

具体程序如下(pascal):

代码仅供参考_____________拒绝CO标

uses math;
var n,i,j,l,ans,tot,q:longint;
a,f:array[0..100000] of longint;
p:boolean;
begin
    readln(n);
    for i:=1 to n do 
    begin
        readln(a[i]);
        inc(tot,a[i]);
        f[i]:=f[i-1]+a[i];
    end;
    p:=true;
    for i:=1 to n do
    begin
        if f[i]>tot/2 then
        begin
            p:=false;
            break;
        end;
    end;
    if not p then dec(i);
    ans:=max(ans,f[i]);
    for j:=2 to n do
    begin
        while (f[i]-f[j-1]<=tot/2)and(i<=n) do
        begin
            ans:=max(ans,f[i]-f[j-1]);
            inc(i);
        end;
        dec(i);
    end;
    writeln(ans);
end.

神奇的指针法。。。。。。

感谢你的阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值