二分 + 贪心
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int N = 100010;
int n, m, k;
vector<int> t(N);
vector<int> c(N);
typedef long long LL;
bool Check(const int T) {
LL costs{0};
for (int i = 0; i < n; i++) {
if (t[i] > T) {
int delta = t[i] - T;
costs += 1LL * delta * c[i];
if (costs > m) return false;
}
}
return costs <= m;
}
int main(int argc, char *argv[]) {
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
cin >> t[i] >> c[i];
}
int l = k, r = *max_element(t.begin(), t.begin() + n);
int res{r};
while (l <= r) {
int mid = l + (r - l) / 2;
if (Check(mid)) {
res = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
cout << res << endl;
return 0;
}