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