[牛客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;
}
posted @ 2021-01-28 14:52  _dwt  阅读(95)  评论(0)    收藏  举报