丢手绢(差分前缀和)

本文介绍了如何解决一个与丢手绢游戏相关的数学问题,即在不均匀排列的小朋友中找到最远的两个小朋友之间的距离。通过解题思路,解释了如何寻找最远距离的方法,涉及到了沿着圆圈的路径计算。最后,提供了实现该算法的代码示例。
摘要由CSDN通过智能技术生成

题解

题目描述

链接https://ac.nowcoder.com/acm/problem/207040
“丢~~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。

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

output:
输出一个整数,为离得最远的两个小朋友的距离。

解题思路

我们先去找距离第一个小朋友最远的小朋友i的位置,第i个小朋友与第一个小朋友之间的距离一定会是刚好过圆周长的一半或刚好没过一半,如果他过半了,则第i+1个小朋友与第一个小朋友的距离一定不会是答案,因为越向后就会离的越近,所以我们就去看第二个小朋友与第i个小朋友的距离,比第一个与第i个的距离,如果这个距离是刚好过半或准备要过半的状态,说明第i个小朋友是距离第二个小朋友最远的人,然后我们就去维护最大的距离。说白了,就是去找距离每个小朋友最远的那个小朋友,比出最大的距离就行。相当于拿了个尺子去卡这个不规则圆的最大“半径”。

代码如下

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a[100010]={0};
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
        a[i]+=a[i-1];//前缀和处理
    }
    int sum=a[n];
    int s=1,e=2;
    int mx=-1;
    while(e<=n&&s<e)
    {
        int dis1=a[e]-a[s];//求出第s个小朋友与第e个小朋友之间的距离
        int dis2=sum-dis1;
        mx=max(mx,min(dis1,dis2));
        if(dis1>dis2)
            s++;
        else
            e++;
    }
    cout<<mx;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值