总结:
这道题最后一个测试点要求比较高,常规做法会超时
这里我用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;
}