第四场 2025 钉耙编程春季联赛 补题 1001
题目
思路
它怎么是个模拟题呢?
需要注意 , 当某个人已经不能被杀死的时候 , 后面也不可能被杀死
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long int
inline int read() {
int ans = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}
while (ch <= '9' && ch >= '0') {
ans = ans * 10 + ch - '0';
ch = getchar();
}
return ans * f;
}
const int N = 10005;
struct item {
int id,a,h;
bool operator<(const item &x) const {
if (h==x.h) {
if (a == x.a)
return id < x.id;
return a < x.a;
}
return h < x.h;
}
};
int to[N];
item a[N];
void solve() {
int n= read(),u=read(),k=read(),hq=read();
for (int i =1; i<= n + 1; i++)
to[i] = 0;
for (int i = 1; i<= n; i++) {
a[i].a = read(), a[i].h =read();
a[i].id = i;
}
sort(a+1,a+1+n);
for (int i = n; i>=1; i--) {
to[i] = max(to[i+1],a[i].a);
}
int u2 = u>>1;
int ans = 0;
for (int i =1; i<= n; i++) {
if (a[i].h <= u) {
ans ++;
hq -=to[i+1];
if (hq <= 0)
break;
}
else {
hq-= to[i];
int times = (a[i].h - u - 1) / u2 + 1;
if (times > k-1) {
//cannot be kill
break;
}
//canbe kill
hq -= to[i] * (times-1);
if (hq >=0)
ans++;
hq -= to[i+1];
if (hq <=0)
break;
}
}
cout<<ans<<"\n";
}
signed main() {
int t =read();
while (t--)solve();
return 0;
}