题意及思路
题意:有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;
}
   
 

京公网安备 11010502036488号