题目
The task is really simple: given N N N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.
Input Specification:
Each input file contains one test case. For each case, the first line contains an integer N N N (in [ 3 , 1 0 5 ] [3,10^5] [3,105]), followed by N integer distances D 1 D 2 ⋯ D N D_1 D_2\cdots D_N D1D2⋯DN, where D i D_i Di is the distance between the i i i-th and the ( i + 1 i+1 i+1)-st exits, and D N D_N DN is between the N N N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M ( ≤ 1 0 4 ) M(\le10^4) M(≤104), with M M M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 1 1 to N N N. It is guaranteed that the total round trip distance is no more than 1 0 7 10^7 107.
Output Specification:
5 1 2 4 14 9
3
1 3
2 5
4 1
Sample Output:
3
10
7
题目大意
有 N N N条路组成一个环,要求输出环上任意两点之间的最短距离。
思路
循环队列的问题,可以在输入的时候对数据进行处理,统一以1最为起点,a[i]
表示1
到i
的距离,再定义一个计量器,记录环的总距离,计算时要保证起点小于终点,最后比较a[j]-a[i]
和sum-(a[j]-a[i])
的大小,取小者即可;
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 100001;
int main(){
int n, m, a[MAXN], sum = 0, t;
scanf("%d", &n);
a[1] = 0;
for(int i=1; i<n; i++){
scanf("%d", &t);
a[i+1] = a[i] + t;
sum += t;
}
scanf("%d", &t);
sum += t;
scanf("%d", &m);
for(int i=0; i<m; i++){
int s, e, temp;
scanf("%d %d", &s, &e);
if(s > e)
swap(s, e);
temp = a[e] - a[s];
printf("%d\n", min(temp, sum-temp));
}
return 0;
}