一开始听课 她说只需要从头到尾遍历一遍就可以 但是现在想想好像不是这么一回事
她的意思是每次j指针后移 当累计长度len * 2 >= 总长度sum,这时候更新答案
ans = max(ans, min(len, sum - len))
但是这样 如果j移动到末尾元素(也就是重新回到起点),此时i肯定没有移动到末尾
那么就忽略掉了i没有遍历到的点的最大距离,这是不能接受的 故应该把他当成一个循环数组,循环条件应该是i <= n,以确保每个点都被遍历到
PS 犯蠢了,如果定义数组1~n,那么在循环时应该使a[0] = a[n], 这样a[j % n],当j == n时就会正确取到a[n]的值,或者就像我代码中那样写

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 100010;
ll a[N], n;
int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  ll len = 0, ans = 0, sum = 0;
  cin >> n;
  for (int i = 1;i <= n; ++ i) {
    cin >> a[i];
    sum += a[i];
  }
  for (ll i = 1, j = 1;i <= n; ++ i) {
    while (2 * len < sum) {
      len += a[j];
      j ++;
      if (j == n + 1) j = 1;//避免取余时取到a[0]
    }
    ans = max(ans, min(sum, sum - len));
    len -= a[i];
  }
  cout << ans << '\n';
}