题解
题意:女孩有一堆蜡烛,每点亮一个蜡烛花1秒,每个蜡烛照亮 t t t 秒,m个小鬼在午夜来拜访,每个小鬼的拜访时间 w i w_i wi 各不相同,每一次拜访女孩需要点燃至少 r r r 个蜡烛,蜡烛可以在提前点燃,问女孩最少要点燃多少根蜡烛
假如蜡烛没有达到
r
r
r 个,肯定是在小鬼到来之前的
w
i
−
t
∼
w
i
−
1
w_i-t\sim w_i-1
wi−t∼wi−1 时点燃蜡烛最优,
统计在这个范围内还能亮的蜡烛(不能亮的蜡烛肯定在这个范围之外),如果不够
r
r
r 个,再找时间插新的
不过由于时间可以提前到午夜之间,也就是说
w
i
−
t
w_i-t
wi−t 可能是负的,所以开个map记录一下
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int m;
int t, r;
int w[N];
map<int,int>d;
int main() {
ios::sync_with_stdio(0);
cin >> m >> t >> r;
for (int i = 1; i <= m; ++i) {
cin >> w[i];
}
sort(w + 1, w + 1 + m);
int sum = 0;
for (int i = 1; i <= m; ++i) {
int cnt = 0;
for (int j = w[i] - 1; j >= w[i] - t; --j) {
if (d[j]) cnt++;
} //统计之前剩余的蜡烛
if (cnt < r) {
for (int j = w[i] - 1; j >= w[i] - t; --j) {
if (!d[j]) d[j]++, cnt++, sum++;
if (cnt == r)break;
}//统计需要再插入的蜡烛
}
if (cnt < r) {
return cout << -1 << endl, 0;
}
}
cout << sum << endl;
return 0;
}