A1046

#include<cstdio>
#include<iostream>
using namespace std;

int d[100010];

int main()
{
    int N;
    scanf("%d",&N);
    d[1]=0;
    for(int i=2;i<=N+1;i++){
        int dis;
        scanf("%d",&dis);
        d[i]=d[i-1]+dis;  //N+1代表一圈总距离
    }
    int M;
    scanf("%d",&M);
    int s,e,left,right;
    while(M--){
        scanf("%d%d",&s,&e);
        if(s>e){
            int t=s;
            s=e;
            e=t;
        }
        left=d[e]-d[s];
        right=d[N+1]-left;
        int maxD=left>right?right:left;
        printf("%d\n",maxD);
    }
    return 0;
}

这道题实质就是从左边走最短还是从右边走最短,因为求得是任意两点间距离,
那么如果我们让数组记为两间隔点的距离的话后面还要累加才行,不妨利用递推公式把距
离数组记为第一个点到每一个点的距离,这样还可以得到总距离,那么只需要求往一边走的距离就可以了。
 

猜你喜欢

转载自blog.csdn.net/fengwuyaQAQ/article/details/85685937
今日推荐