你管理一个疫苗接种站,将会有 \(n\) 个人前来接种疫苗。第 \(i\) 个到来的人时间为 \(t_i\) ,已知每个人的等待时间不会超过 \(w\) 分钟。
疫苗存放在特质冰箱中,一袋疫苗有 \(k\) 支,当一袋疫苗在 \(x\) 时刻打开时,它的有效时间为 \(d\) 。
现在询问最少需要打开多少袋疫苗满足 \(n\) 个人都可以接种。
记:某袋疫苗对应的第一个人在 \(cur\) 时刻到达,则他可以等待到 \(cur + w\) 时刻,在此时打开这带疫苗,于是它会在 \(cur + w + d\) 时刻失效。若这袋疫苗用完,相当于提前失效。
于是可以使用在线维护区间的双指针算法处理。
view
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve(){
int n, k, d, w; std::cin >> n >> k >> d >> w;
std::vector<int> a(n+1);
for (int i = 1; i <= n; i++) std::cin >> a[i];
int ans = 0;
for (int i = 1; i <= n; i++) {
int j = i, cnt = 0;
while (j <= n && a[j] <= a[i] + w + d && cnt + 1 <= k) { // 当前的 j ,上一个 cnt
j += 1;
cnt += 1;
}
j -= 1; cnt -= 1;
ans += 1;
i = j;
}
std::cout << ans << '\n';
}
int main() {
int _ = 1; std::cin >> _;
while (_--) solve();
return 0;
}