一、思路
构造dist[],dist[i]为i号出口距离1号出口的公里数,同时dist[N]即为环形公路总公里数;
输入e1,e2(若e2<e1则交换),由于公路是环形,则dist[e2] - dist[e1]即两出口间沿正向的距离,而dist[N] - (dist[e2] - dist[e1])即为两出口间沿逆向的距离;
逐个求解会出现测试点2超时
二、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N, M;
scanf("%d", &N);
vector<int> dist(N + 2, 0);
for( int i = 1, d; i <= N; ++i )
{
scanf("%d", &d);
dist[i + 1] = dist[i] + d;
}
scanf("%d", &M);
for( int i = 0, e1, e2, d; i < M; ++i )
{
scanf("%d %d", &e1, &e2);
if( e1 > e2 )
swap(e1, e2);
printf("%d\n", min( dist[e2] - dist[e1], dist[N + 1] - dist[e2] + dist[e1] ));
}
}