//算法核心:尺取法 //不用前缀和,用前缀和想了半天,循环数组不好解决 //最远距离不超过圆周长的一半,所以当跑在前面的小朋友跑过周长一半时候, //再跑,两者距离只会减小,没有意义了,应该停下来,后面追的小朋友向前走一步 #include <bits/stdc++.h> using namespace std; int arr[100005];//距离 int main() { int i,n,j,maxn,sum=0,len=0,flag=0,cnt=0; cin>>n;//输入 for(i=0;i<n;i++) {cin>>arr[i];sum+=arr[i];}//记录和,求一半 int p=0,half=sum/2;//p为后面追的小朋友 for(i=0;i<=n;i++,i%=n) { len+=arr[i]; if(len==half) {maxn=half;break;}//如果距离到周长一半直接输出了 while((len>half&&p<=i)||(len>half&&p<=i+n-1))//超过一半时,第二个情况是求第1和第N个小朋友 { if(!flag) maxn=len-arr[i];//先找到第一次满足要求的距离 flag=1; len-=arr[p%n];//后指针向前移动 p++; } maxn=max(maxn,min(len,sum-len));//方便计算直接取len和圆周长减去len的最小值,肯定比周长一半小 if(maxn==half) break;//如果距离是周长一半就输出 if(i==0) cnt++;//计算第1和第N个小朋友间距离时的情况 if(cnt==2) break; } cout<<maxn<<endl; }