题目链接在此。
题意理解
这个题目自己看了多遍题目竟然没太明白题目的意思,自己的英语水平……
题目意思:有N个点围成一个圈,相邻两点的距离已知,且每次只能移动到相邻点。然后给出M个问题,每个问题给出两个节点A和B,求从A到B的最短距离。
因为这道题目在《算法笔记》的“简单模拟”章节,通过脑子里现有的简单模拟的思想,没有想出合适的思路。
这个题的标题十分的明确——“最短路径”,这就让我联想到了图的相关知识,由于这部分知识已经忘了,就想先看一下题解吧……
思路:用整型数组dis[i]表示从1号节点顺时针走到i+1号节点的路径长度(则dis[1]为0),然后用整型变量sum记录走一圈的路径长度,这样一来,题目需要求的就是从节点A到节点B的最短路径,即dis[B]-dis[A]和sum-(dis[A]-dis[B])两者中的较小的一个。
注意:由于题目没有保证B节点序号一定大于A节点,故需要在A节点序号大于B节点序号的时候做一下交换。
AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int N;
scanf("%d",&N);
int A[N];
int sum = 0;
int dis[N];
dis[0] = 0;
for(int i = 0; i < N; i++){
scanf("%d",&A[i]);
sum += A[i];
dis[i+1] = sum;
}
int M;
scanf("%d",&M);
int left, right;
for(int i = 0; i < M; i++){
scanf("%d %d",&left, &right);
left-=1; right-=1;
if(left > right){
int temp = left;
left = right;
right = temp;
}
int x = dis[right]-dis[left];
printf("%d\n",min((sum-x), x));
}
return 0;
}
附
这个题目参考了《算法笔记》的思路。
根据不太多的经验,这种和一个Cycle(循环)有关的题目,一般都是从某个方向入手,然后从全局和已获知的这个方向可以推知另一个方向,然后两个方向取“最优解”。
看看之后的“经验”能不能验证这个猜想,哈哈^_^
《算法笔记》购买地址。