pat1046. Shortest Distance (20)

1046. Shortest Distance (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<queue>
 6 #include<vector>
 7 #include<cmath>
 8 #include<string>
 9 using namespace std;
10 int dis[100005];
11 int main(){
12     //freopen("D:\INPUT.txt","r",stdin);
13     int n;
14     scanf("%d",&n);
15     int i;
16     dis[1]=0;
17     int total=0;
18     for(i=2;i<=n;i++){
19         scanf("%d",&dis[i]);
20         dis[i]=dis[i]+dis[i-1];
21     }
22     scanf("%d",&dis[0]);
23     total=dis[n]+dis[0];//一个环总长度
24     //cout<<total<<endl;
25     int m;
26     scanf("%d",&m);
27     int a,b;
28     for(i=0;i<m;i++){
29         scanf("%d %d",&a,&b);
30         if(a>b){
31             a=a+b;
32             b=a-b;
33             a=a-b;
34         }
35         printf("%d
",dis[b]-dis[a]<total-(dis[b]-dis[a])?dis[b]-dis[a]:total-(dis[b]-dis[a]));
36     }
37     return 0;
38 }
原文地址:https://www.cnblogs.com/Deribs4/p/4770973.html