Attention:
①在暴力求解的思路上进行优化
以下是原始70分代码,按照题意存数之后一个个比较即可,运行超时。
#include<bits/stdc++.h>
using namespace std;
#define MAX 500000
int T[MAX], C[MAX], K[MAX];
int main()
{
int n, m, k, t, c, q, ans;
memset(K, 0, sizeof(K));
cin >> n >> m >> k;
for(int i = 0; i < n; ++i)
{
cin >> t >> c;
T[i] = t, C[i] = c;
}
for(int i = 0; i < m; ++i)
{
ans = 0;
cin >> q;
for(int j = 0; j < n; ++j)
{
if((T[j] >= q + k) && (T[j] < q + k + C[j]))ans++;
}
cout << ans << endl;
}
return 0;
}
以下是满分代码,新设置时间表数组K。每当输入一个活动时间时,在时间表中将应该做核酸的时间点+1。查询时,直接输出K数组对应q时间点的数值即可。
#include<bits/stdc++.h>
using namespace std;
#define MAX 500000
int T[MAX], C[MAX], K[MAX];
int main()
{
int n, m, k, t, c, q, ans, s, e;
memset(K, 0, sizeof(K));
cin >> n >> m >> k;
for(int i = 0; i < n; ++i)
{
cin >> t >> c;
T[i] = t, C[i] = c;
s = t - k - c;
if(s < 0)s = 0;
e = t - k;
if(e < 0)e = 0;
for(int j = s + 1; j <= e; ++j)
K[j]++;
}
for(int i = 0; i < m; ++i)
{
ans = 0;
cin >> q;
cout << K[q] << endl;
}
return 0;
}