
“丢~丢~丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
题目
- 原题地址:丢手绢
- 题目编号:NC207040
- 题目类型:尺取法
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 丢手绢坐法,定义两个人的距离为顺时针距离和逆时针距离的最小者
- 求一圈人中的最大距离
2.题目分析
- 累加到临界值时(达到周长的一半),进行比较,对于每个结点都判断一下其最远距离是多少
- 通过尺取法来避免暴力运算情况下对每个结点的重复累加操作
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int all = 0;
int a[n];
for(int i=0;i<n;i++)
{
cin >> a[i];
all += a[i];
}
int sum = 0;
int ans = 0;
for(int i=0, j=0;i<n;i++)
{
while(sum*2<all)
sum += a[j++%n];
ans = max(ans, min(sum, all-sum));
sum -= a[i];
}
cout << ans << endl;
}