题目
过程
第一次提交
暴力求解,时间复杂度为n*n,超时
#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m,k;
int t[N],c[N],q[N];
int main()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
cin>>t[i]>>c[i];
}
for(int i=0;i<m;i++)
{
int q=0;
cin>>q;
int sum=0;
for(int i=0;i<n;i++)
{
if((q+k<=t[i])&&(q+k+c[i]>t[i]))
{
sum++;
//cout<<"满足"<<i<<endl;
}
}
cout<<sum<<endl;
}
return 0;
}
第二次提交
由题意知若正常出行,出行时刻需满足:
对不等式进行变换可得
,
即 ,
含义为在[t-c+1,t]时间区间内拿到核酸结果才可正常出行。
同时,像t=5,c=24这样的情况,最早也只能在0时刻取得核酸结果,因此时间区间的开始时刻改为start=max(t-c+1,0)
使用一个数组a[N]记录,哪些时刻拿到核酸结果可以正常出行。如第5条出行计划,t=35,c=24,在[12,35]之间拿到核酸结果则可以正常出行,则a[12]=1,a[13]=1...a[35]=1。
输入查询q,代表q时刻做核算,得到核酸的时间为q+k,只需读取a[q+k]即可得知在这个时刻拿到核酸结果可以满足几条出行计划。
参考:http://t.csdnimg.cn/karIY
PS:
一开始设置a[100001],运行超时,后来按照参考代码就正确了,没想明白,,,,
#include<iostream>
using namespace std;
int n, m, k, t, c, q;
int a[300002] = { 0 };
int main()
{
cin >> n >> m >> k;
for(int i = 0; i < n; i++)
{
cin >> t >> c;
for (int j = max(0, t - c + 1); j <= t;j++)
{
a[j]++;
}
}
for (int i = 0; i< m; i++)
{
cin >> q;
cout << a[q + k]<< endl;
}
return 0;
}