丢手绢(双指针)

丢手绢

题目描述

"丢~丢~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。"

牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。

因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。

输入描述:

复制代码
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。
接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。
最后一行是第N个小朋友顺时针到第一个小朋友的距离。

输出描述:

复制代码
输出一个整数,为离得最远的两个小朋友的距离。

示例1

输入

复制代码
3
1
2
3

输出

复制代码
3

备注:

复制代码
2≤�≤1000002≤N≤100000
距离和(圆圈周长)小于等于2147483647

思路:

用双指针模拟区间,求最大就近距离

代码:

cpp 复制代码
#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求,然后max
        x-=a[i];//左端点即将转移,减去这个值
    }
    cout<<mix;
}
相关推荐
手握风云-7 分钟前
优选算法的妙思之流:分治——快排专题
数据结构·算法
熬夜苦读学习15 分钟前
Linux进程信号
linux·c++·算法
白白糖17 分钟前
二叉树 递归
python·算法·力扣
jyyyx的算法博客29 分钟前
Leetcode 857 -- 贪心 | 数学
算法·leetcode·贪心·嗜血
ChoSeitaku37 分钟前
NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
算法·矩阵·蓝桥杯
l1n3x40 分钟前
编译原理前端-词法分析
算法·编译原理
G皮T1 小时前
【Python Cookbook】字符串和文本(五):递归下降分析器
数据结构·python·正则表达式·字符串·编译原理·词法分析·语法解析
一只天蝎的晋升之路1 小时前
基础算法之:动态规划
算法·动态规划
KangkangLoveNLP1 小时前
手动实现一个迷你Llama:使用SentencePiece实现自己的tokenizer
人工智能·深度学习·学习·算法·transformer·llama
独好紫罗兰1 小时前
洛谷题单3-P1420 最长连号-python-流程图重构
开发语言·python·算法