PAT A1046 Shortest Distance
思路:预处理从 1 号结点到 N 号节点的距离之和,另外使用 dist 数组,dist[i - 1] 代表 1 号结点到 i 号结点的距离。 故 dist(left, right) (left < right) 可以表示成 dist[right - 1] - dist[left - 1]。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 100005;
int N, M;
int D[MAXN], dist[MAXN];
int main() {
cin >> N;
int sum = 0;
for(int i = 1; i <= N; i++) {
cin >> D[i];
sum += D[i];
dist[i] = sum;
}
cin >> M;
int left, right, temp;
for(int i = 0; i < M; i++) {
cin >> left >> right;
if(left > right) swap(left, right);
temp = dist[right - 1] - dist[left - 1];
cout << min(temp, sum - temp) << endl;
}
return 0;
}