PAT(Advanced) 甲级1046 Shortest Distance (前缀和)C++实现
题目链接
PAT(Advanced)1046 Shortest Distance
题目大意
在一个给定的圈中,根据询问输出两个点的最短路径
算法思路
在一个圈中,两个点之间的距离只有从一个点左边到一个点右边和从该点右边到该点左边两个距离。设置前缀和数组D,D[0] = 0,D[i] = D[i - 1] + D[i] (i = 1,2,···,N),分别从两个方向计算距离,取最小值,min(D[big] - D[small], D[small] + D[N] - D[big]),取下标值较大的作为被减数。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int MAX_SIZE = 100000 + 10;
int main(int argc, char const *argv[])
{
int N;
while (~scanf("%d", &N)) {
int d = 0;
int D[MAX_SIZE];
D[0] = 0;
for (int i = 1; i <= N; i++) {
int temp;
scanf("%d", &temp);
d += temp;
D[i] = d;
}
int M;
scanf("%d", &M);
for (int i = 0; i < M; i++) {
int start, target;
scanf("%d%d", &start, &target);
int big = max(start - 1, target - 1);
int small = min(start - 1, target - 1);
printf("%d\n", min(D[big] - D[small], D[small] + D[N] - D[big]));
}
}
return 0;
}
样例输入
5 1 2 4 14 9
3
1 3
2 5
4 1
样例输出
3
10
7
样例图解
红蓝两条路径为两个不同的距离
鸣谢
感谢PAT提供的题目及测评平台!
最后
本题采用前缀和的方式就算最短路径, 能够得到更好的时空复杂度,本算法的时间复杂度为O(max(N, M))
由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!