PTA -- A1046 Shortest Distance

 

題意及思路

題意:有N個節點(1至N),求給定的st號到en號的距離最小值,這些點構成一個環,即1->2 ... ->N ->1。ios

思路:第一步,預處理操做,以dis[ i ] 表示:第1號節點到 i 所指的下一個節點的距離(順時針的下一個位置),同時記錄環的總距離sum。第二步,計算給定請求的兩點距離最短和,由公式可得dis[ en - 1 ] - dis [ st - 1 ] 。最終取前面所得值t 和 sum - t 的較小值便可。(公式須要想想,下面附上了思惟草圖,很不嚴謹)數組

注意點:第一點,st ,en注意大小,若st > en ,則交換。第二點,雖然這題就是一個簡單的模擬,可是給定的範圍蠻大,若是使用遍歷數組O(n)複雜度的暴力法,沒法在給定時限內完成,因此這題的關鍵在於預處理操做spa

附上思惟草圖:(右邊紅色部分是例子)code

 

 

代碼

#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;
}
相關文章
相關標籤/搜索