[NC207040]丢手绢
这道题是牛客上的一道题,这道题看似简单,但是坑点不少,好了,我们一起来看看题意吧:
题目描述
“丢~丢~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
输入描述
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。
接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。
最后一行是第N个小朋友顺时针到第一个小朋友的距离。
输出描述
输出一个整数,为离得最远的两个小朋友的距离。
示例1
输入
3
1
2
3
输出
3
题目链接: [NC207040]丢手绢
思路
:
这道题也不能直接暴力,我们需要用双指针算法进行优化,具体的我们来看看代码吧!
我们来看看成功AC的代码吧:
#include<bits/stdc++.h> using namespace std; int a[100010]; int n; int ans; int main(){ cin>>n; int r=0; int su=0; for(int i=1;i<=n;i++) cin>>a[i],su+=a[i]; int to = su/2; int x=0; for(int i=1;i<=n;i++){ while(x<to){ r++; x+=a[r%(n+1)];//这里要记住取余,可以回忆下循环队列 } ans=max(ans,min(x,su-x)); x-=a[i]; } cout<<ans; return 0; }