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