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;
}