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

视频讲解

视频链接

相关推荐
A星空1235 分钟前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫27 分钟前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
power 雀儿33 分钟前
掩码(Mask)机制 结合 多头自注意力函数
算法
会叫的恐龙37 分钟前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6011 小时前
C++顺序表和vector
开发语言·c++·算法
独望漫天星辰1 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
We་ct1 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel6891 小时前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖6661 小时前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan1 小时前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划