洛谷U611548 助教的比拼

题目

思路

代码

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;
}

视频讲解

视频链接

相关推荐
wuhen_n17 小时前
LeetCode -- 15. 三数之和(中等)
前端·javascript·算法·leetcode
sin_hielo17 小时前
leetcode 2483
数据结构·算法·leetcode
Xの哲學18 小时前
Linux多级时间轮:高精度定时器的艺术与科学
linux·服务器·网络·算法·边缘计算
大头流矢18 小时前
归并排序与计数排序详解
数据结构·算法·排序算法
阿闽ooo18 小时前
外观模式:从家庭电源控制看“简化接口“的设计智慧
c++·设计模式·外观模式
油泼辣子多加18 小时前
【信创】算法开发适配
人工智能·深度学习·算法·机器学习
Aaron158819 小时前
AD9084和Versal RF系列具体应用案例对比分析
嵌入式硬件·算法·fpga开发·硬件架构·硬件工程·信号处理·基带工程
laocooon52385788619 小时前
插入法排序 python
开发语言·python·算法
你的冰西瓜19 小时前
C++中的list容器详解
开发语言·c++·stl·list
wuhen_n19 小时前
LeetCode -- 1:两数之和(简单)
javascript·算法·leetcode·职场和发展