题目如下:
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.
输入格式:
Each input file contains one test case. For each case, the first line contains an integer N (in [3, 10^5]), 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 (<=10^4), 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 10^7.
[简要翻译:每个输入包含一个测试样例。对于每一个测试样例,第一行包含一个整数N,然后跟着N个距离整数D1 D2 …….DN,Di表示第i个节点和第i+1个节点的距离,以此类推形成循环距离。第一行的每一个数用空格间隔开。第二行给出一个表示测试样例数量的正整数M,之后跟着M行,每行包含两个整数(1~N)用于测试求解。应该要保证总的往返距离不大于10^7]
输出格式:
For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.
输入样例:
5 1 2 4 14 9
3
1 3
2 5
4 1
输出样例:
3
10
7
题意:
有N个结点围成一个圈,相邻两个点之间的距离已知,且每次只能移动到相邻结点。然后给出M个询问,每个询问给出两个数字A和B即结点编号(1<=A,B<=N),求从A号结点到B号结点的最短距离。
样例解释:
思路:
注意点:
代码:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("in.txt");
#define cin fin
int main()
{
int n;
cin>>n;
int* dis = new int[n+1];
int d;
int i;
int sum = 0;
for(i=0;i<n;i++)
{
cin>>d;
dis[i+1] = sum;
sum = sum + d;
}
int m;
cin>>m;
int begin,end;
int total;
for(i=0;i<m;i++)
{
cin>>begin>>end;
if(begin>end)
{
total = dis[begin]-dis[end];
}else
{
total = dis[end]-dis[begin];
}
if(sum-total > total)
{
cout<<total<<endl;
}else
{
cout<<sum-total<<endl;
}
}
system("PAUSE");
return 0;
}