首先我们知道每一个病人有自己的到来时间。
其次,我们知道每一个病人最多等待w时间,很容易想到贪心思路,让每一个病人都等到最后的w再服用疫苗。
还有,至关重要的一点,我们知道一个疫苗最多能使用d时间,否则需要答案加一。
最后,注意疫苗的包数和k数。
根据以上就可以很容易得到一个更新的思路,我们每次枚举每一个人,如果她和前面的人相距大于d+w的时间,就需要答案加一,或者当其数量超过K时都需要增加一个答案。
好了,看代码。
#include <bits/stdc++.h>
using namespace std;
const int N = 200050;
int a[N];
int main() {
int t;
cin >> t;
while (t--) {
int n, k, d, w;
cin >> n >> k >> d >> w;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int ans = 1;
int last = 1;
for (int i = 1; i <= n; i++) {
if (a[i] - a[last] > d + w || i - last + 1 > k) {
ans++;
last = i;
}
}
cout << ans << "\n";
}
return 0;
}