每日AC

许诺  •  2个月前


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct Worker {

ll A, B;

};

bool can_reach(ll t, const vector& workers, ll M, ll T) {

ll current_res = M;
ll current_eff = 0;
for (ll i = 0; i < t; ++i) {
    ll remaining = t - i;
    vector<Worker> valid;
    for (const auto& w : workers) {
        if (w.B * remaining >= w.A) {
            valid.push_back(w);
        }
    }
    sort(valid.begin(), valid.end(), [remaining](const Worker& a, const Worker& b) {
        return a.B * remaining * b.A > b.B * remaining * a.A;
    });
    for (const auto& w : valid) {
        if (current_res < w.A) continue;
        ll buy = current_res / w.A;
        current_res -= buy * w.A;
        current_eff += buy * w.B;
    }
    current_res += current_eff;
    if (current_res >= T) {
        return true;
    }
}
return current_res >= T;

}

int main() {

ios::sync_with_stdio(false);
cin.tie(0);

ll N, M, T;
cin >> N >> M >> T;

if (M >= T) {
    cout << 0 << endl;
    return 0;
}

vector<Worker> workers;
bool has_zero_cost = false;
for (ll i = 0; i < N; ++i) {
    ll A, B;
    cin >> A >> B;
    if (B == 0) continue;
    if (A == 0) {
        has_zero_cost = true;
    }
    workers.push_back({A, B});
}

if (has_zero_cost) {
    cout << 1 << endl;
    return 0;
}

if (workers.empty()) {
    cout << (M >= T ? 0 : -1) << endl;
    return 0;
}

ll left = 1, right = T - M;
ll answer = -1;
while (left <= right) {
    ll mid = (left + right) / 2;
    if (can_reach(mid, workers, M, T)) {
        answer = mid;
        right = mid - 1;
    } else {
        left = mid + 1;
    }
}

cout << answer << endl;
return 0;

}


评论:

请先登录,才能进行评论