NC207040 丢手绢

丢手绢

https://ac.nowcoder.com/acm/problem/207040

链接:https://ac.nowcoder.com/acm/problem/207040
来源:牛客网

题目描述
“丢丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
输入描述:
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。
接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。
最后一行是第N个小朋友顺时针到第一个小朋友的距离。
输出描述:
输出一个整数,为离得最远的两个小朋友的距离。

思路:对圈圈进行尺取法操作,先右指针右移记录距离,当距离大于周长一半时看之前记录的最大距离与目前距离相比哪个大。之后再左指针右移进行重复操作后直到左指针回到原点时即为循环结束,其中要注意的是右指针右移的时候是可以超过边界的(因为这个WA了几次)
代码如下:

#include <iostream>

using namespace std;
int a[100010];
int main()
{
    int n;
    int suml=0;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
        suml+=a[i];//记录周长
    }
    int l=0,r=0,cnt=0,ans=0;
    while(l<n)
    {
        while(cnt<suml/2)//当当前长度未超过周长一半时将下一条长度加入进去
        {
            cnt+=a[r%n];//注意r是能超过边界的,可以利用%来重新记录原先记录过的长度
            r++;
        }
        ans=max(ans,min(cnt,suml-cnt));
        cnt-=a[l++];
    }
    cout<<ans;
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务