许诺 • 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;
}
评论:
请先登录,才能进行评论