题目粗心:

有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数组保留累计长度的信息,会超时,因为每次都得遍历数组
提交后果:

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;}