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
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    AOP实践--利用MVC5 Filter实现登录状态判断
    InstallShield12的安装破解方法
    phantomjs + python 打造一个微信机器人
    ASP.NET MVC4中@model使用多个类型实例的方法
    ssi技术
    ubuntu下面如何切换virtual_box的鼠标
    叫醒你的是闹钟,还是梦想?
    在linux命令行中直接执行php命令
    如何修改mysql默认的数据库密码
    【转】想要成功,请记住!
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12284815.html
Copyright © 2011-2022 走看看