題意:有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; }