A1046 Shortest Distance 最短路径

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]), followed by Ninteger distances D1​​ D2​​ ⋯ DN​​, where Di​​ is the distance between the i-th and the (-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(≤), 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 1.

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

思路:

•数据构成环,使用dis[i]存储i+1点到第1个点的距离,比较dis[right-1]-dis[left-1]和sum-(dis[right-1]-dis[left-1])得到shortest distance,此时时间复杂度是O(1);

•不存在顺序问题,当左大右小时,swap(left,right);

•数组存储时将第一个点到第一个点存在了dis[0],转一圈的距离存到dis[n];

以上参考《算法笔记》和我自己的理解(*/ω\*)

 

 1 #include <iostream>
 2 #include <algorithm> //min swap
 3 #include <cstring>
 4 using namespace std;
 5 const int MAX = 100005;
 6 int main() {
 7     int n, num, m, left, right;
 8     int dis[MAX];
 9     memset(dis, 0, sizeof(dis));
10     cin >> n;
11     for (int i = 1; i <=n; i++) {
12         cin >> num;
13         dis[i] = dis[i - 1] + num;
14     }
15     int sum = dis[n];
16     cin >> m;
17     for (int i = 0; i < m; i++) {
18         cin >> left >> right;
19         if (right < left)swap(left, right);
20         //int temp = dis[right - 1] - dis[left - 1];
21         //cout << min(temp, sum - temp) << endl;
22         cout << min(dis[right - 1] - dis[left - 1], sum - (dis[right - 1] - dis[left - 1]))<<endl;
23     }
24     return 0;
25 }

 

posted @ 2020-02-08 20:09  PennyXia  阅读(186)  评论(0编辑  收藏  举报