圆周舞蹈_纪中1745_二分查找

55 篇文章 0 订阅

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

  一行,表示最大距离。

题解

对于每一对牛都有顺时针和逆时针两种距离,要使最小值最大,两者就要尽可能接近

于是我们就可以枚举每头牛,二分一个对点,找最小的差,更新一下ans就好了

然并卵这并不是正解

code

#include <stdio.h>
#include <cstring>
#include <cmath>
using namespace std;
int a[100001];
int sum[200001];
int ans=0;
int main()
{
    int n,mid,x,q=0;
    int min=1<<31-1;
    scanf("%d",&n);
    for (int i=2;i<=n+1;i++)
    {
        scanf("%d",&x);
        q+=x;
        sum[i]=sum[i-1]+x;
    }
    for (int i=n+2;i<=2*n;i++)
        sum[i]=sum[i-n]+q;
    int g;
    for (int i=1;i<=n;i++)
    {
        int l=i,r=i+n;
        int x,y;
        min=1<<31-1;
        while (l<=r)
        {
            mid=(l+r)/2;
            x=sum[mid]-sum[i];
            y=sum[i+n]-sum[mid];
            if (abs(x-y)<min)
            {
                min=abs(x-y);
                if (x<y)
                    g=x;
                else
                    g=y;
                if (g>ans)
                    ans=g;
            }
            if (l==mid) break;
            if (x<y)
                l=mid;
            else
                r=mid;
        }
        x=sum[r]-sum[i];
        y=sum[n+i]-sum[r];
        if (abs(x-y)<min)
        {
            min=abs(x-y);
            if (x<y)
                g=x;
            else
                g=y;
            if (g>ans)
                ans=g;
        }
    }
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值