PAT(Advanced) 甲级1046 Shortest Distance (前缀和)C++实现

PAT(Advanced) 甲级1046 Shortest Distance (前缀和)C++实现

题目链接

PAT(Advanced)1046 Shortest Distance

题目大意

在一个给定的圈中,根据询问输出两个点的最短路径

算法思路

在一个圈中,两个点之间的距离只有从一个点左边到一个点右边和从该点右边到该点左边两个距离。设置前缀和数组D,D[0] = 0,D[i] = D[i - 1] + D[i] (i = 1,2,···,N),分别从两个方向计算距离,取最小值,min(D[big] - D[small], D[small] + D[N] - D[big]),取下标值较大的作为被减数。

AC代码

    #include <bits/stdc++.h>
    using namespace std;
    const int MAX_SIZE = 100000 + 10;
    int main(int argc, char const *argv[])
    {
        int N;
        while (~scanf("%d", &N)) {
            int d = 0;
            int D[MAX_SIZE];
            D[0] = 0;
            for (int i = 1; i <= N; i++) {
                int temp;
                scanf("%d", &temp);
                d += temp;
                D[i] = d;
            }
            int M;
            scanf("%d", &M);
            for (int i = 0; i < M; i++) {
                int start, target;
                scanf("%d%d", &start, &target);
                int big = max(start - 1, target - 1);
                int small = min(start - 1, target - 1);
                printf("%d\n", min(D[big] - D[small], D[small] + D[N] - D[big]));
            }
        }
        return 0;
    }

样例输入

5 1 2 4 14 9
3
1 3
2 5
4 1

样例输出

3
10
7

样例图解

红蓝两条路径为两个不同的距离
在这里插入图片描述

鸣谢

感谢PAT提供的题目及测评平台!

最后

本题采用前缀和的方式就算最短路径, 能够得到更好的时空复杂度,本算法的时间复杂度为O(max(N, M))

由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值