The task is really simple: given 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 (in [3,105]), followed by N integer distances D1 D2 ⋯ DN, where Di is the distance between the i-th and the (i+1)-st exits, and DN is between the 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 (≤104), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 107.
Output Specification:
For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.
Sample Input:
5 1 2 4 14 9
3
1 3
2 5
4 1
Sample Output:
3
10
7
大意:就是输入一个环的节点个数以及相邻节点之间的距离,计算给出节点之间最近的距离。
简析:就是算出环的总长以及给定之间的距离,然后比较给定之间的距离和环的另一个方向走的距离的长度,然后输出比较小的。这道题设置了一个坑就是后面不能一个一个加,即使设置了短的路径一个一个加也会超时,所以在输入长度时就把特定点到1号点的距离算出来,到时候直接找特定点然后减一下就可以了,时间复杂度就为O(1),不会超时。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> num(n+1, 0);
num[0] = 0;
int sum = 0;
for (int i = 1; i <=n;i++)
{
int a;
cin >> a;
sum += a;
num[i] = sum;
}
int k;
cin >> k;
vector<int> dis(k, 0);
int cnt = 0;
int q = k;
while(k--)
{
int a, b;
cin >> a >> b;
int temp = 0;
if(a>b)
{
int tem = a;
a = b;
b = tem;
}
a = (a - 1)%n;
b = (b - 1) % n;
temp = num[b] - num[a];
if(temp<sum-temp)
dis[cnt++] = temp;
else
dis[cnt++] = (sum - temp);
}
for (int i = 0; i < q;i++)
cout << dis[i] << '\n';
return 0;
}