看题目还以为是考察图论里的知识,结果发现这是目前为止最简单的题目之一。
就是一个圈上若干个点,求两点之间的最短距离。其实两点之间就两条路线,顺时针和逆时针而已…这题的核心显而易见,是在考察两个数比较大小。顺时针依次加就行了,逆时针的距离等于总距离减顺时针距离,甚至连跨过原点需要整除处理等等都不需要。
#include<stdio.h>
#include<memory.h>
#include<algorithm>
using namespace std;
int D[100001];
int main()
{
memset(D, 0, sizeof(int) * 100001);
int total = 0;
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
int d;
scanf("%d", &d);
D[i] = D[i - 1] + d;
}
int M;
scanf("%d", &M);
for (int i = 0; i < M; i++)
{
int a, b;
scanf("%d %d", &a, &b);
int ans;
ans = min(D[max(a, b) - 1] - D[min(a, b) - 1], D[N] - (D[max(a, b) - 1] - D[min(a, b) - 1]));
printf("%d\n", ans);
}
return 0;
}