【CCF】202203-2出行计划

题目

样例输入

6 2 10
5 24
10 24
11 24
34 24
35 24
35 48
1
2
Data

样例输出

3
3
Data

样例解释

时刻 1 做检测,可以满足第三、四、六项出行计划;

时刻 2 做检测,可以满足第四、五、六项出行计划。

子任务

C++

暴力枚举--超时

 1 //超时
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 
 5 const int N=1e5;
 6 //要求 进场时间》出结果时间=检测时间+等待时间
 7 // 出结果时间+限制时间-1》进场时间
 8 int t[N],c[N],q[N];//进场时间、限制时间、检测时间
 9 int n,m,k;//出行计划数目、查询个数以及等待核酸检测结果所需时间。
10 
11 int main()
12 {
13     cin>>n>>m>>k;//k是等待时间
14     for(int i=0;i<n;i++)
15     {
16         cin>>t[i]>>c[i];//进场时间 限制时间
17     }
18     for(int i=0;i<m;i++)//查询
19     {
20         cin>>q[i];//检测时间
21         int sum=0;
22         for(int j=0;j<n;j++)
23         {
24             if(t[j]>=q[i]+k && t[j]<=q[i]+k+c[j]-1)
25             // 进场时间》出结果时间=检测时间+等待时间
26             // 进场时间《出结果时间+限制时间-1
27             sum++;
28         }
29         cout<<sum<<endl;
30     }
31 
32     return 0;
33 }

差分数组

 1 //进场时间t、限制时间c、检测时间q、等待时间k
 2 //有效期【检测时间+等待时间,检测时间+等待时间+限制时间-1】
 3 //即[q+k,q+k+c-1]
 4 //需要满足 q+k<=t<=q+k+c-1
 5 //即 t−k−c+1≤q≤t−k  对检测时间q进行判断 是否在区间内
 6 #include<bits/stdc++.h>
 7 using namespace std;
 8 using LL = long long;//重命名 C++11
 9 const int N = 4e5 + 10;
10 int f[N];
11 int main ( ) {
12     int n, m, k, t, c;
13     cin >> n >> m >> k;//出行计划数目、查询个数以及等待核酸检测结果所需时间。
14     for (int i = 0; i < n; ++i) 
15     {
16         cin >> t >> c;//进场时间 限制时间
17         // 则 在[l, r] 时间段内做核酸 则此时可以通行
18         int l = t - k - c + 1 > 0 ? t - k - c + 1 : 1;
19         int r = t - k > 0 ? t - k : 1;
20         // 查分数组更新
21         f[l] += 1; //相当于[l...]都加1     
22         f[r + 1] -= 1;//相当于[r+1...]都-1
23         //也就是[l..r]都加一 如果是[l..r]那么可以通行数目+1
24     }
25     // 差分数组 预处理
26     for (int i = 1; i < N; ++i) 
27     { 
28         f[i] += f[i - 1]; 
29     }
30     int q;
31     for (int i = 0; i < m; ++i) 
32     {
33         cin >> q;//检测时间
34         cout << f[q] << endl;           // 直接查询 q 时刻可以通行 的数目
35     }
36     return 0;
37 }

 

python-差分数组

 1 N=int(4e5)
 2 n,m,k=map(int,input().split())
 3 f=[0]*N
 4 for i in range(0,n):
 5     t,c=map(int,input().split())
 6     l=t-k-c+1 if  t - k - c + 1 > 0 else 1
 7     r =  t - k if t - k > 0 else 1 
 8     f[l]+=1
 9     f[r+1]-=1
10 for i in range(1,N):
11     f[i]+=f[i-1]
12 for i in range(0,m):
13     q=int(input())
14     print(f[q])

 

posted @ 2023-02-22 14:26  吃人不吐葡萄  阅读(290)  评论(0)    收藏  举报