题意及思路

题意:有N个节点(1至N),求给定的st号到en号的距离最小值,这些点构成一个环,即1->2 ... ->N ->1。

思路:第一步,预处理操作,以dis[ i ] 表示:第1号节点到 i 所指的下一个节点的距离(顺时针的下一个位置),同时记录环的总距离sum。第二步,计算给定请求的两点距离最短和,由公式可得dis[ en - 1 ] - dis [ st - 1 ] 。最终取前面所得值t 和 sum - t 的较小值即可。(公式需要想一想,下面附上了思维草图,很不严谨)

注意点:第一点,st ,en注意大小,若st > en ,则交换。第二点,虽然这题就是一个简单的模拟,但是给定的范围蛮大,如果使用遍历数组O(n)复杂度的暴力法,无法在给定时限内完成,所以这题的关键在于预处理操作

附上思维草图:(右边红色部分是例子)



代码

#include <iostream>
#include <algorithm>

using namespace std;

const int MAX = 100005;
int dis[MAX],arr[MAX];

int main(){
    int n;
    cin >> n;
    int sum = 0;
    for(int i=1;i<=n;i++) {
        cin >> arr[i];
        sum += arr[i];
        dis[i] = sum; //key code
    }
    int m,st,en;
    cin >> m;
    while(m--){
        cin >> st >> en;
        if(st>en) swap(st,en);
        int t = dis[en-1] - dis[st-1];
        cout << min(t,sum-t) << endl;
    }
    return 0;
}