PAT(甲级)1046 Shortest Distance (20point(s))

环形路收费站距离算法
本文介绍了一种解决环形路上任意两个收费站间最短距离的算法。通过预计算从首个收费站到各点的距离,实现了快速查找顺时针或逆时针的最短路径。特别处理了环路总长及起止点顺序问题。
题目

题目链接

思路

题目大意:有一条环形的路,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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值