【CCF】202203-2出行计划
题目

样例输入
样例输出
样例解释
时刻 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])

浙公网安备 33010602011771号