PAT甲级.1046. Shortest Distance (20)

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.

输入格式:

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.

输出格式:

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

PAT链接


思路:

*1.用dist[i]来存1号点到i号点顺时针方向下一个点的的距离,sum存储一 圈的总长度。注意要在输入的时候直接累加sum并赋值给dist[i]
*2.first和second分别记录要求的两个点标号(保证second > first,不然就swap)
求出顺时针和逆时针的弧长,进行比较,得出小的那一个

clockwise = dist[second - 1] - dist[first - 1]; 
//得到顺时针的距离
printf("%d\n", min(clockwise, sum - clockwise));    
//用总距离-顺时针距离得到逆时针距离
//选顺时针和逆时针距离中小的那一个

代码:

/**
* @tag     PAT_A_1046
* @authors R11happy (xushuai100@126.com)
* @date    2016-07-20 20:30:16-21:04
* @version 1.0
* @Language C++
* @Ranking  40/6605
*/

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>    //要用到swap和min函数
using namespace std;

typedef long long ll;
const int MAXN = 1e5 + 5;   //100000另一种表达 1e5

int dist[MAXN];    //dist[i]存放第1号节点,顺时针到达第i号节点下一节点的距离
int main()
{
    ll N, M, sum = 0;
    ll clockwise = 0;    //记录顺时针的距离
    int temp, first, second;
    scanf("%lld", &N);      //注意long long 一定要用%lld,不然会直接跳出
    for (int i = 1; i <= N; i++)
    {
        scanf("%d", &temp);
        sum += temp;
        dist[i] = sum;  //输入的时候就记录1节点到每个节点的距离
    }
    int T;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d", &first, &second);
        if (first > second)
        {
            swap(first, second);
        }
        clockwise = dist[second - 1] - dist[first - 1]; //得到顺时针的距离
        printf("%d\n", min(clockwise, sum - clockwise));    //用总距离-顺时针距离得到逆时针距离
                                                            //选顺时针和逆时针距离中小的那一个
    }
    return 0;
}

收获:

1.#include <algorithm>头文件自带min()和swap()函数
2. 用1e5表示100000
3. 求逆时针的弧长用总弧长-顺时针弧长即可,要记录1号到i号之间的顺时针弧长
4. 输入的时候要对dist[]和sum进行预处理,不然容易超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值