[牛客207040]丢手绢
链接:https://ac.nowcoder.com/acm/problem/207040
description:
N个小朋友围成一圈丢手绢, 求这里面任意两个人之间的最大环形距离, (取顺时针和逆时针的最小).
输入\(N\), 接下来\(N\)行输入每两个相邻小朋友间距离.
输出一行答案.
solution:
预处理求出周长, 讨论以\(0\)~\(N-1\)每一个点为起点的顺时针距离, 我们只考虑顺时针就够了(所有的距离不超过周长的一半).
实现采用双指针, 尾指针\(j\)向后寻找不过半的最大距离, 头指针\(i\)遍历每个起点.
code:
#include<cstdio>
int dis[114514];
int main() {
int N;
int sum=0 ;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", dis+i);
sum += dis[i];
}
int cur = 0, ans = 0;
int j = 0;
for (int i = 0; i < N; i++) {
while (cur+dis[j] <= (sum>>1)) {
cur += dis[j];
j = (j + 1)%N;
}
ans = cur > ans ? cur : ans;
cur -= dis[i];
}
printf("%d\n", ans);
return 0;
}