1
题目大意:

有N个结点围成一个圈,相邻两个点之间的距离已知,且每次只能移动到相邻点。然后给出M个询问,每个询问给出两个数字A和B即结点编号(1≤A,B≤N),求从A号结点到B号结点的最短距离。

算法思路:

由于这n各点组成了一个环,那么A到B有2条路径可以走,我们就假定按照输入的方向为顺时针方向,那么使用数组sum[N+1]保存1点到下一个顶点的距离,那么按照顺时针方向,任意2点a和b(a<b)的距离为sum[b-1]-sum[a-1],该环的长度为sum[N],逆时针的距离为sum[N]-(sum[b-1]-sum[a-1]),最终的2点之间的距离为min(sum[b-1]-sum[a-1],sum[N]-(sum[b-1]-sum[a-1])).

注意点:
1、输入的查询的2点a和b,a有可能大于b,需要交换位置
2、如果没有使用sum数组保存累计长度的信息,会超时,因为每次都得遍历数组
提交结果:

图片.png

AC代码:
#include<cstdio>
#include<algorithm>

using namespace std;

int main(){
    int N;
    scanf("%d",&N);
    int d[N+1];// d[i]表示i到i+1的距离,d[N]表示N到1的距离 
    int sum[N+1];// sum[i]表示从1到i+1的距离,sum[N]就是一圈的长度 
    for(int i=1;i<=N;++i){
        scanf("%d",&d[i]);
        sum[i] = sum[i-1]+d[i];
    }
    int M;
    scanf("%d",&M);
    for(int i=0;i<M;++i){
        int a,b;
        scanf("%d %d",&a,&b);
        if(a>b){
            int c = a;
            a = b;
            b = c;
        }
        int dist = sum[b-1]-sum[a-1];
        printf("%d\n",min(dist,sum[N]-dist));
    }
    return 0;
} 

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得