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
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12284815.html
Copyright © 2011-2022 走看看