zoukankan      html  css  js  c++  java
  • 1046 Shortest Distance (20 分)(模拟)

    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

    分析:

    简单模拟。所有结点连起来会形成一个环形。dis[i]存储第1个结点到第i个结点的下一个结点的距离。sum保存整个路径一圈的总和值。求得结果就是dis[right – 1] – dis[left – 1]和 sum – dis[right – 1] – dis[left – 1]中较小的那一个~~

    注意:

    可能left和right的顺序颠倒了,这时候要把left和right的值交换~

    原文链接:https://blog.csdn.net/liuchuo/article/details/52108507

    超时题解

    额,就不知为何超时,,,

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
    #ifdef ONLINE_JUDGE
    #else
        freopen("1.txt", "r", stdin);
    #endif
        int n,m,sum=0,a,b;
        scanf("%d",&n);
        vector<int> v(n+1);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&v[i]);
            sum+=v[i];
        }
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            int temp=0;
            scanf("%d%d",&a,&b);
            if(a>b) swap(a,b);
            for(int j=a;j<b;j++){
                temp+=v[j];
            }
            printf("%d\n",temp<sum-temp?temp:sum-temp);
        }
        return 0;
    }
    

    正确题解

    正好刚做完一个用累加和然后相减的方法求两个坐标之间差值的题,这里用的方法也一样啦~
    求得结果就是dis[right – 1] – dis[left – 1]和 sum – dis[right – 1] – dis[left – 1]中较小的那一个~

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
    #ifdef ONLINE_JUDGE
    #else
        freopen("1.txt", "r", stdin);
    #endif
        int n,m,sum=0,a,b;
        scanf("%d",&n);
        vector<int> v(n+1);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&v[i]);
            sum+=v[i];
            //这个地方的小技巧就是累加
            v[i]+=v[i-1];
        }
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&a,&b);
            if(a>b) swap(a,b);
            int temp=v[b-1]-v[a-1];
            printf("%d\n",temp<sum-temp?temp:sum-temp);
        }
        return 0;
    }
    
  • 相关阅读:
    php安装yaf,memcache,memcached模块
    django的ORM操作
    Composer简介
    MySQL中exists和in的区别及使用场景
    MySQL事务原理浅析
    MySQL JOIN原理
    mysql 子句、子查询、连接查询
    多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
    数据库多表连接方式介绍-HASH-JOIN
    MySQL中的case when 中对于NULL值判断的坑
  • 原文地址:https://www.cnblogs.com/moonlight1999/p/15576082.html
Copyright © 2011-2022 走看看