A1046.Shortest Distance

本文介绍了一种计算高速公路循环出口间最短距离的方法。给定N个出口形成的简单环形结构,通过输入各出口间的距离,可以计算任意两出口间的最短路径。文章提供了具体的实现代码,展示了如何通过计算来解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下:
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.

输入格式:
Each input file contains one test case. For each case, the first line contains an integer N (in [3, 10^5]), 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 (<=10^4), 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 10^7.
[简要翻译:每个输入包含一个测试样例。对于每一个测试样例,第一行包含一个整数N,然后跟着N个距离整数D1 D2 …….DN,Di表示第i个节点和第i+1个节点的距离,以此类推形成循环距离。第一行的每一个数用空格间隔开。第二行给出一个表示测试样例数量的正整数M,之后跟着M行,每行包含两个整数(1~N)用于测试求解。应该要保证总的往返距离不大于10^7]

输出格式:
For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.

输入样例:
5 1 2 4 14 9
3
1 3
2 5
4 1

输出样例:
3
10
7

题意:
有N个结点围成一个圈,相邻两个点之间的距离已知,且每次只能移动到相邻结点。然后给出M个询问,每个询问给出两个数字A和B即结点编号(1<=A,B<=N),求从A号结点到B号结点的最短距离。

样例解释:
这里写图片描述

思路:

注意点:

代码:

#include <iostream>  
#include <fstream>  

using namespace std;  

ifstream fin("in.txt");  
#define cin fin  

int main()  
{  
    int n;  
    cin>>n;  
    int* dis = new int[n+1];  
    int d;  
    int i;  
    int sum = 0;  
    for(i=0;i<n;i++)  
    {  
        cin>>d;  
        dis[i+1] = sum;  
        sum = sum + d;  
    }  

    int m;  
    cin>>m;  
    int begin,end;  
    int total;  
    for(i=0;i<m;i++)  
    {  
        cin>>begin>>end;  
        if(begin>end)  
        {  
            total = dis[begin]-dis[end];  
        }else  
        {  
            total = dis[end]-dis[begin];  
        }  

        if(sum-total > total)  
        {  
            cout<<total<<endl;  
        }else  
        {  
            cout<<sum-total<<endl;  
        }  

    }  
    system("PAUSE");  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值