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

视频讲解

视频链接

相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
weilx12341 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛1 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·1 天前
C++ 萌新语法入门篇
c++·算法比赛
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集