NC207040 丢手绢
题目描述
链接:https://ac.nowcoder.com/acm/problem/207040
来源:牛客网
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
前缀和为什么不行
因为前缀和的不是很容易处理循环的情况, 并且\(\mathcal O(n^3)\)也是不可接受的.
Idea.
一个点离其他点的最远距离一定是在总距离的一半的两边
Code
#include <bits/stdc++.h>
#define F(i, a, b) for(int i = a; i<=b; i++)
#define Fd(i, b, a) for(int i = b; i>=a; i--)
#define MAXN 100010
using namespace std;
int a[MAXN];
int suma =0;
int main(){
int n; cin>>n;
F(i, 0, n-1){
cin>>a[i];
suma += a[i];
}
int r = 0, sum = 0,ans = -14514191;
F(l, 0, 2*n-1){
while(r<2*n && sum<suma/2){
sum += a[r%n];
r++;
}
// if(sum <= suma/2){
ans = max(ans, min(sum, suma-sum));
// }
sum -= a[l%n];
}
cout<<ans<<endl;
}