本文主要是介绍丢手绢(双指针),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
丢手绢
题目描述
“丢~丢~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
输入描述:
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。 接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。 最后一行是第N个小朋友顺时针到第一个小朋友的距离。
输出描述:
输出一个整数,为离得最远的两个小朋友的距离。
示例1
输入
3 1 2 3
输出
3
备注:
2≤�≤1000002≤N≤100000 距离和(圆圈周长)小于等于2147483647
思路:
用双指针模拟区间,求最大就近距离
代码:
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main(){int n;cin>>n;int mix=0;int sum=0;for(int i=1;i<=n;++i){cin>>a[i];sum+=a[i];//总距离}int r=0,to=sum/2,x=0;//右端点,人与人的最大距离为周长/2,人与人的距离for(int i=1;i<=n;++i){//左端点while(x<to){//小于最大距离x+=a[(r++)%(n+1)];//一直加}mix=max(mix,min(x,sum-x));//由于是最大的就近距离,所以开个min求,然后maxx-=a[i];//左端点即将转移,减去这个值}cout<<mix;
}
这篇关于丢手绢(双指针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!