题目

思路

代码
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9;
using ll = long long; // 用long long避免整数溢出
int main() {
// 关闭同步流,加速cin/cout
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
ll n, m;
cin >> n >> m; // n: ZQH组人数, m: QWH组平均分
ll sum = 0; // 记录ZQH组当前总分
ll x, y; // x: 学员当前分数, y: 单次可提升分数
// 大顶堆:优先选单次能提升最多分的学员(贪心策略)
priority_queue<pair<ll, ll>> pq;
for (int i = 1; i <= n; i++) {
cin >> x >> y;
sum += x; // 累加当前总分
// 若提升后超过100,修正为最多能提升到100的分数
if (x + y > 100)
y = 100 - x;
// 堆中存:{单次可提升分数, 当前分数}
pq.push({y, x});
}
// 特殊情况1:QWH平均分是100,无法超过,输出-1
if (m == 100) {
cout << -1 << '\n';
return 0;
}
// 特殊情况2:当前总分已经超过m*n(当前平均分已超QWH),输出0
if (m * n < sum) {
cout << 0 << '\n';
return 0;
}
ll ans = 0; // 记录需要的辅导次数
while (!pq.empty()) {
// 取当前能提升最多分的学员
auto [y_curr, x_curr] = pq.top();
pq.pop();
ans++; // 辅导次数+1
sum += y_curr; // 总分增加本次提升的分数
x_curr += y_curr; // 该学员的新分数
// 计算该学员下次最多能提升的分数(不能超过100)
if (x_curr + y_curr > 100)
y_curr = 100 - x_curr;
pq.push({y_curr, x_curr}); // 把更新后的学员放回堆中
// 当总分超过m*n(平均分超过QWH),结束循环
if (sum > m * n)
break;
}
cout << ans << '\n';
return 0;
}