前言:还是一道双指针的题,不过你有没有发现它有点特殊?题解4、5的双指针都是在一条直线区间上进行的,意味着左界的索引(下标)要比右界的大。但在这一题中还是这样吗?

思路(先学会题解4):要找距离最大的点,所以当右界前进到符合题目要求的点的下一步,左界继续前进,但在左界前进过程中,万一右界已经到头(数组有效索引最大值n)了怎么办?这时候左指针并没有遍历完整个区间,并没有计算完任意一个点到其他某个点距离的最大值(注意,双指针也是在遍历,只是内层循环因为题目的条件,不用每在每次外层循环中都重新走)。所以我们让右指针继续顺时针“转圈”从n转到1(此处自行脑补一个从1到n的圈)。直到左指针遍历完整个区间(外层循环结束)。最后输出答案即可。

代码(注:ts是距离和,sum是输出的答案,tsum是临时记录距离的变量)

#include<iostream>
using namespace std;
int a[100010];
int n;int ts=0;int sum=0;int tsum=0;
int main()
{   
    ios::sync_with_stdio(false);cin.tie(nullptr);
    cin>>n;
    for(int i=1;i<=n;i++){cin>>a[i];ts+=a[i];}
    for(int i=1,j=1;i<=n;i++)
    {   
        while( j<=n && 2*tsum <ts)
        {
            tsum+=a[j];
            j++;
            if(j==n+1){j=1;}
        }
        sum=max(sum,ts-tsum);//while循环退出证明2*tsum>=ts,即ts-tsum<=ts;符合两个点最短距离的定义
        tsum-=a[i];
    }    
    cout<<sum;
    return 0;
}