AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 校园
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 692. G巴士计数 | 两种方法    原题链接    简单

作者: 作者的头像   trudbot ,  2022-06-23 23:52:48 ,  所有人可见 ,  阅读 15


1


方法一 暴力

将每辆巴士的服务范围存储起来, 再遍历得到服务某城市的巴士数量.
c++10ms, 时间限制以及测试数据都太宽松, 暴力完全没有问题
单次测试数据的时间复杂度为O(N*P)

//
// Created by trudbot on 2022/6/23.
//

#include <bits/stdc++.h>

using namespace std;

int main() {
    vector<pair<int, int>> bars;

    int T, N, P, C;
    int l, r;
    int i, j, k;
    int count;
    cin >> T;
    for(i=1; i<=T; i++)
    {
        cin >> N;
        for(j=0; j<N; j++)
        {
            cin >> l >> r;
            bars.emplace_back(l, r);
        }

        cin >> P;
        cout << "Case #" << i << ":";
        while(P--)
        {
            count = 0;
            cin>> C;
            for(auto p : bars)
            {
                if(C>=p.first && C<=p.second)
                    count++;
            }
            cout << " " << count;
        }

        bars.clear();
        cout << endl;
    }

    return 0;
}

更为巧妙的方法

我们是否能通过所有巴士的服务范围而直接得到任何一座城市的巴士数量呢
对一段序列{0, 0, 0, 0, 0}, 如果我们想让它第二到第四个元素都加个1, 我们可以让第二个元素+1, 第五个元素-1,
得到{0, 1, 0, 0, -1}, 再执行seq[i] = seq[i]+seq[i-1], 就可以得到{0, 1, 1, 1, 0}. 这种变化是线性传递的, 2处的变化和5处的变化相互抵消, 从而2的变化只影响了[2, 5)

如下代码c++6ms, 面对较大数据时表现较好

//
// Created by trudbot on 2022/6/23.
//

#include <bits/stdc++.h>

using namespace std;

int main() {
    int count[5010];
    int T, N, P, C;
    int i, j, k;
    int l, r;

    cin >> T;
    for(i=1; i<=T; i++)
    {
        for(j=1; j<5001; j++)
            count[j] = 0;
        cin >> N;
        for(j=0; j<N; j++)
        {
            cin>> l >> r;
            count[l]++;
            count[r+1]--;
        }

        for(j=2; j<=5001; j++)
            count[j] += count[j-1];

        cin >> P;
        cout << "Case #" << i << ":";
        while(P--)
        {
            cin >> C;
            cout << " " << count[C];
        }

        cout << endl;
    }

    return 0;
}

0 评论

你确定删除吗?

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息