这道题有些陷阱的点,分析的时候要注意一些点,比如我一开始没有想到如果给出的第一个点比第二个点大需要交换两者的数值,从而得到两点间的距离数值的绝对值(因为距离肯定是正的),且在得到两点之间的距离时需要注意到题目需要求的是最短距离,如下图所示,很明显每两点之间有两条路径,因此需要比较两条路径的大小再进行确定。
求最短路径
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, dot1, dot2, sum = 0;
scanf("%d", &n);
vector<int> v(n + 1);
for(int i = 1; i <= n; i++){
int temp;
scanf("%d", &temp);
sum += temp;
v[i] = sum;
}
scanf("%d", &m);
for(int j = 0; j < m; j++){
scanf("%d %d", &dot1, &dot2);
if(dot1 > dot2)
swap(dot1, dot2);
int re = v[dot2 - 1] - v[dot1 - 1];
printf("%d\n", min(re, sum - re));
}
return 0;
}












网友评论