题目:
牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。
因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。
- 大意:小朋友围成一个圆圈,找到距离最远的两个小朋友,记录其距离。
- 注意:距离:沿着圆圈顺时针走或者逆时针走的最近距离。
- 思路:采取 前缀和+尺取法,一般情况下,最远距离应该在圆圈的直径附近,所以我们通过尺取法找到“大于直径的最小距离”.
- 遇到的问题: 一开始我是将更新ans值放在大于等于sum值里面,通过了90%的数据,后来才想到可能到不了刚好超过直径的那个点(或者超过直径的下一个点就是原点),也就是说在到达直径之前就已经是最远距离了("小于直径的最大距离"),所以每次移动左右指针都更新一下距离就可以解决这个问题(即将更新ans值语句放在if语句外面)
#include<bits/stdc++.h> using namespace std; int ans = 0; int a[100010]; int main(){ int n; cin >> n; int sum = 0; for(int i = 1; i <= n; i++){ cin >> a[i]; sum += a[i]; a[i] += a[i -1]; } int l = 0, r = 0; while(r <= n){ int len = min(a[r] - a[l], sum - (a[r] - a[l])); ans = max(ans, len); if((a[r] - a[l])* 2 >= sum ){ l++; }else{ r++; } } cout << ans; return 0; }



京公网安备 11010502036488号