PAT A1046 Shortest Distance (20)

总结:
这道题最后一个测试点要求比较高,常规做法会超时

这里我用dis数组存下点1到点n的距离,每一个组i到j可以表示为dis[i+1]-dis[i-1]=sum1

然后sum存一圈的距离,sum1和sum中较小的就是答案

代码:

#include<iostream>
#include<vector>
using namespace std;
int a[120000];
int dis[12000];
int main()
{
    int m, n;
    scanf("%d", &m);
    int sum = 0;
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &a[i]);
        if (i>0)dis[i] = dis[i-1]+a[i-1]; else dis[i] =0;
        sum += a[i];
    }
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        int now=0, to=0; int min = 0;
        scanf("%d%d", &now, &to);
        if (to<now)swap(now,to);
        int kk = dis[to - 1] - dis[now - 1];
        int sum1 = sum - kk;
        if (sum1>kk)min = kk; else min = sum1;
        printf("%d\n",min);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/luoshiyong123/article/details/81363617