Nebius Welcome Round (Div. 1 + Div. 2) B. Vaccination

发布时间 2023-10-21 20:04:30作者: zsxuan

你管理一个疫苗接种站,将会有 \(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;
}