PAT甲级刷题笔记:
题号:1046 Shortest Distance (20 分)
题目:
The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.
**
Input Specification:
解决方案:
注:本内容参考各位大佬的代码学习而来。欢迎目前再刷pat的伙伴来一起讨论。
1.先考虑数据结构:
本题要求段距离,因为题目相对简单,不考虑用图来存储。
2.逻辑:
本算法的逻辑,即为求出一个点到另一个点距离的最小值,根据题目考虑,一个点到另一个点只可能有2总情况,只要分别求出并且找到最小的即可。
3.主要实现原理:
主要的想是引入一个数组dis[],存一个变量到其任意定点的距离,这样随意给定求两点距离只需要相减:如:3到5的距离,则是1到5的距离减去1到3的距离,(想不清楚的可以建一个一维的循环坐标轴把其中一个固定为原点),具体实现代码如下:
#include<iostream>
#include<algorithm> //数学头文件
using namespace std;
const int MAX = 1000005; //最大数字为10的五次方
int main(){
int dis[MAX], A[MAX];
int n, sum = 0;
scanf("%d",&n);
for(int i = 1;i<=n;i++){
scanf("%d",&A[i]);
sum+=A[i];
dis[i] = sum;
}
int M, r, l;
scanf("%d",&M);
for(int i = 1;i<=M;i++){
scanf("%d %d",&r,&l);
if(l>r)
swap(l,r);
int temp = dis[r-1]-dis[l-1];
printf("%d\n",min(temp,sum-temp));
}
return 0;
}
主要学到的内容:
- algorithm库里面部分函数的的使用,swap() , min()
- 本来想用图的邻接矩阵的存储形式,然后用短路径的求法解决,但是看好多人说复杂度太高,果断放弃。