PAT-A 1046. Shortest Distance (20)

题目链接在此

题意理解

这个题目自己看了多遍题目竟然没太明白题目的意思,自己的英语水平……

题目意思:有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(循环)有关的题目,一般都是从某个方向入手,然后从全局和已获知的这个方向可以推知另一个方向,然后两个方向取“最优解”。
看看之后的“经验”能不能验证这个猜想,哈哈^_^

《算法笔记》购买地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值