用双指针,从第一个小朋友开始一圈圈按顺时针方向遍历,到最后一个小朋友的那圈遍历完结束。
因为题目定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离,所以在计算最远距离时要让当前两个小朋友的距离小于圆圈周长的二分之一,不然最短距离就会变成从逆时针方向开始计算,这是一个小坑
同时,计算的时候数组里第i个元素储存的是第(i+1)个小朋友到第(i+2)个小朋友的距离,所以代码23-25行是先+= distances[end]再让end指向下一个人,也是一个小坑
#include <iostream> #include <vector> using namespace std; int main() { int temp; //悲惨的工具人变量(和我一样) int N; //小朋友的个数 vector<int> distances; //两个相邻小朋友的顺时针距离 int sumOfDistance = 0; //整个圆圈的总距离 cin >> N; for (int i = 0; i < N; ++i) { cin >> temp; distances.push_back(temp); sumOfDistance += temp; } //双指针计算最远距离 int begin = 0, end = 0, distance = 0, maxDistance = 0; while (begin < N) { if (distance <= sumOfDistance / 2) { if (distance > maxDistance)maxDistance = distance; //因为数组存的是和下一个小朋友的距离,所以应该先+=distances[end]再end++ distance += distances[end]; end++; end = end % N; } else { distance -= distances[begin]; begin++; } } cout << maxDistance << endl; }