题解
题目描述
链接https://ac.nowcoder.com/acm/problem/207040
“丢~丢~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
input:
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。
接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。
最后一行是第N个小朋友顺时针到第一个小朋友的距离。
output:
输出一个整数,为离得最远的两个小朋友的距离。
解题思路
我们先去找距离第一个小朋友最远的小朋友i的位置,第i个小朋友与第一个小朋友之间的距离一定会是刚好过圆周长的一半或刚好没过一半,如果他过半了,则第i+1个小朋友与第一个小朋友的距离一定不会是答案,因为越向后就会离的越近,所以我们就去看第二个小朋友与第i个小朋友的距离,比第一个与第i个的距离,如果这个距离是刚好过半或准备要过半的状态,说明第i个小朋友是距离第二个小朋友最远的人,然后我们就去维护最大的距离。说白了,就是去找距离每个小朋友最远的那个小朋友,比出最大的距离就行。相当于拿了个尺子去卡这个不规则圆的最大“半径”。
代码如下
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[100010]={0};
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
a[i]+=a[i-1];//前缀和处理
}
int sum=a[n];
int s=1,e=2;
int mx=-1;
while(e<=n&&s<e)
{
int dis1=a[e]-a[s];//求出第s个小朋友与第e个小朋友之间的距离
int dis2=sum-dis1;
mx=max(mx,min(dis1,dis2));
if(dis1>dis2)
s++;
else
e++;
}
cout<<mx;
return 0;
}