zoukankan      html  css  js  c++  java
  • 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 }
    作者:PennyXia
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    使用 Jackson – 将字符串转换为 JsonNode 对象
    Java 8 及其后续版本的新遍历 forEach
    IntelliJ IDEA 快速插入 for 循环
    在 Discourse 中如何使用输入对话框
    如何修改 Discourse 的域名
    Confluence 数据中心版本接近生命周期了
    IntelliJ IDEA 中如何将 POM 中的版本号快速提出为属性
    RedHat 8 如何检查端口是否联通
    二、RabbitMq安装
    一、RabbitMQ 的概念
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12284815.html
Copyright © 2011-2022 走看看