版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
写在前面
- 思路分析
- 给出1个环,已知环的每条边(公路)长度,现给出起点和终点,求出起点和终点之间的最短路径长度,即求顺时针和逆时针行驶的距离最小值
- 环的任意两点就两条路,算出环长和任意一条路的大小比较,取最小值
- 题目简单,方案有1定难度
测试用例
-
input: 5 1 2 4 14 9 3 1 3 2 5 4 1 output: 3 10 7
ac代码
-
#include <iostream> #include <vector> using namespace std; int main() { int n; scanf("%d", &n); vector<int> dis(n+1); int sum = 0, left, right, cnt; // 记录环长 for(int i=1; i<=n; i++) { int tmp; scanf("%d", &tmp); sum += tmp; dis[i] = sum; } scanf("%d", &cnt); for(int i=0; i<cnt; i++) { scanf("%d %d", &left, &right); // 从小顶点到大顶点,默认顺序查找 if(left > right) swap(left, right); int tmp = dis[right-1]-dis[left-1]; // 输出最小值 printf("%d\n", min(tmp, sum - tmp)); } return 0; }