[NC207040]丢手绢

Posted cq.tiancx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NC207040]丢手绢相关的知识,希望对你有一定的参考价值。

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

谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,望各位老板点点赞,加个关注!

以上是关于[NC207040]丢手绢的主要内容,如果未能解决你的问题,请参考以下文章

1875 丢手绢

数据结构与算法: 约瑟夫问题(丢手绢)

算法题之丢手绢问题

丢手绢(尺取)

丢手绢(尺取)

ZJNU 1531 - 丢手绢--中级