【CCF CSP】202203-2—出行计划

文章讨论了如何使用差分算法解决出行计划问题,通过计算每个场所的最早和最晚准入时间,确定在给定时间内满足核酸结果要求的场所数量。暴力解法因两重循环效率低,而差分数组法能有效避免,但难点在于理解L和R的计算方式。
摘要由CSDN通过智能技术生成

1. 题目要求

在这里插入图片描述

2. 前提

在这里插入图片描述

3. 思想

1.暴力解法,两重循环,70分
2.差分算法,100分。
思想:求出每个场所的最早准入时间和最晚准入时间,用差分数组存起来,则每个[L,R]区间内都是>=1的数,区间之外的数字都是0。对于每个查询,只要核酸结果在这些区间中,就能求出有几个场所可以去。
但我理解不了人家代码里的L,R是怎么求出来的,/(ㄒoㄒ)/~~(后面的固定套路,+1,-1,求前缀和我倒是理解。)

3. 代码

(70分代码)(两重循环,运行超时)

#include <iostream>
#include <vector>
using namespace std;

/*
n-出行计划数目
m-查询个数
k-等待核酸检测结果所需时间
**/
int main(){
    int n,m,k;
    cin >> n>> m >> k;
    int startTime,ans, endTime;
    vector<int> t(n+1);//出行去i场所的时间t[i]
    vector<int> c(n+1);//该场所需持有c[i]个单位时间内的核酸检测结果入内
    vector<int> q(m+1);//如果在q[i]时刻做了核酸检测,有多少项出行计划的核酸检测要求可以得到满足?
    for(int i = 1; i <= n; i++){
        cin>> t[i] >> c[i];
    }
    for(int i = 1; i <= m; i++){
        cin >> q[i];
        startTime = q[i]+k;
        ans = 0;
        for(int j = 1; j <= n; j++){
            endTime = startTime+c[j]-1;
            if(startTime<=t[j]&&t[j]<=endTime)
                ans++;
        }
        cout << ans <<endl;
    }


}

//进场时间t、限制时间c、检测时间q、等待时间k
//有效期【检测时间+等待时间,检测时间+等待时间+限制时间-1】
//即[q+k,q+k+c-1]
//需要满足 q+k<=t<=q+k+c-1
//即 t−k−c+1≤q≤t−k  对检测时间q进行判断 是否在区间内
#include<bits/stdc++.h>
using namespace std;
using LL = long long;//重命名 C++11
const int N = 4e5 + 10;
int f[N];
int main ( ) {
    int n, m, k, t, c;
    cin >> n >> m >> k;//出行计划数目、查询个数以及等待核酸检测结果所需时间。
    for (int i = 0; i < n; ++i)
    {
        cin >> t >> c;//进场时间 限制时间
        // 则 在[l, r] 时间段内做核酸 则此时可以通行
        int l = t - k - c + 1 > 0 ? t - k - c + 1 : 1;  //不理解怎么求出来的,也不理解为什么可以是1.
        int r = t - k > 0 ? t - k : 1;//不理解怎么求出来的,也不理解为什么可以是1.
        // 差分数组更新 (下面的代码都是固定套路,可以理解)
        f[l] += 1; //相当于[l...]都加1
        f[r + 1] -= 1;//相当于[r+1...]都-1
        //也就是[l..r]都加一 如果是[l..r]那么可以通行数目+1
    }
    // 差分数组 预处理
    for (int i = 1; i < N; ++i)
    {
        f[i] += f[i - 1];
    }
    int q;
    for (int i = 0; i < m; ++i)
    {
        cin >> q;//检测时间
        cout << f[q] << endl;           // 直接查询 q 时刻可以通行 的数目
    }
    return 0;
}

4. 结果

5. 总结

6. 参考代码

https://www.cnblogs.com/kay425/articles/17144232.html

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值