第四场 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;
}

posted @ 2025-03-29 13:04  Guaninf  阅读(22)  评论(0)    收藏  举报