题目
思路
题目大意:有一条环形的路,n个收费站把整条路分为好多段,告诉你每段的长度,现在让求出任意两个收费站之间的最短距离;
因为是环形的,那么从一个收费站到另一个收费站只有两条路,顺时针走或者逆时针走,取二者的最小值输出即可;
考虑一个问题:怎么能快速计算出从一个收费站到另一个收费站的距离,可以在读入数据时计算从第一个收费站到每个收费站i的距离,用dis[i]存储,这样在计算i, j顺时针的距离时只需要 dis[j] - dis[i] 即可,逆时针的距离就是 sum - 顺时针的距离;
注意:根据题意,dis[1] 没有给出,但是需要初始化为零;
最后一个数据也需要特殊读入,用来得到整个环形路的总长度;
当 i > j 时,要交换二者的顺序;
代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int maxn = 1e5 + 10;
int dis[maxn];
int main()
{
int n, t, sum = 0, m;
scanf("%d", &n);
dis[1] = 0;//第一个点到第一个点的距离为零
for(int i = 2; i <= n; i ++) {
scanf("%d", &t);
sum += t;
dis[i] = sum;
}
//特殊处理最后一个元素,目的是求出这个圈的总路径
scanf("%d", &t);
sum += t;
scanf("%d", &m);
int u, v, ans;
for(int i = 0; i < m; i ++){
scanf("%d%d", &u, &v);
if(u > v) swap(u, v);//注意,如果起始点大于终止点,交换位置
ans = min(dis[v] - dis[u], sum - dis[v] + dis[u]);
printf("%d\n", ans);
}
system("pause");
return 0;
}
环形路收费站距离算法
本文介绍了一种解决环形路上任意两个收费站间最短距离的算法。通过预计算从首个收费站到各点的距离,实现了快速查找顺时针或逆时针的最短路径。特别处理了环路总长及起止点顺序问题。
347

被折叠的 条评论
为什么被折叠?



