1 条题解

  • 4
    @ 2025-11-15 19:48:44
    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    
    void solve() {
        int n,C; cin >> n >> C;
        priority_queue<int> pq; // 优先队列 pq,用于优先处理人数多的余数
        int ans = 0; // 记录总考场数
        string name; 
        int num; 
        for(int i = 1; i <= n; i++){
            cin >> name >> num;
            // 计算该学校需要的监考人数(向上取整)并输出
            cout << name << " " << (num + C - 1) / C << '\n';
             // ans累加整除部分的考场数
            ans += num/C;
            if(num%C != 0) pq.push(num%C); // 余数入 队列,后续处理
        }
        int a[100000]; // 记录各考场已占用的人数,用于判断空位
        int id = 0; // 下标
        while(!pq.empty()){
            int op = pq.top();
            pq.pop(); // 取出当前最大的余数
            bool ok = false;
            for(int i = 1; i <= id; i++){
                if(op <= C - a[i]){ // 若当前考场空位能容纳该余数
                    a[i] += op; // 占用空位
                    ok = true;
                    break;
                }
            }
            if(!ok) { // 无法容纳,新增考场
                a[++id] = op; 
                ans++;
            }
        }
        cout << ans  << '\n'; 
    }
    
    signed main() {
        ios::sync_with_stdio(0);
        cin.tie(0),cout.tie(0);
        int T = 1;
        while (T--)
            solve();
        return 0;
    }
    
    • @ 2025-11-15 20:03:23
      对每所学校,先计算其初步需要的监考人数(即考场数,通过向上取整(num + C - 1) / C实现)并输出。
          同时统计该学校人数整除C的考场数,将余数(若不为 0)存入 优先队列。
          处理余数:从 优先队列 中取出余数,
          尝试将其放入已有考场的空位(通过数组a记录各考场已用人数,计算空位C - a[i])。
          若能放入则更新考场已用人数;
          若不能则新增考场,最终统计总考场数并输出。
      
          余数的核心问题是 “凑空位” —— 每个余数代表某学校分配完完整考场后剩下的人数,
          需要找其他学校的余数 “凑满一个考场(容量 C)”,从而不用新开考场。
          使用优先队列(大根堆)的核心目的是 最大化利用考场空位,减少总考场数,
          本质是通过 “优先处理难匹配的大余数”,避免资源浪费。
      
          大余数的 “匹配难度更高”
          如果先处理小余数,可能会出现 “小余数占了大空位,导致后续大余数无法匹配,只能新开考场” 的浪费情况;
          而先处理大余数,让它们先占据考场并留下空位,后续小余数可以灵活填补这些 “难用” 的小空位,从而减少新开考场的数量。
      
          总结:优先队列(大根堆)的作用是 优先取出最大余数,让难匹配的大余数先占位,
          后续小余数填补其留下的小空位,最大化利用每个考场的容量,最终实现总考场数最少的目标。
          这样才是最贪心的做法!
          考察随机应变能力,学过queue, 给出priority_queue的介绍和用法,结合题意想到最贪心的做法,然后去模拟就行了
      
    • @ 2025-11-15 20:11:10

      第一问都好算;

      第二问直接排序去做的,做法不够贪心!

      仔细想想就知道可能不是最优的,这时候去看题目给的提示条件,试着去想 这个提示对我做这道题有什么帮助?

      priority_queue和普通的queue有什么不同 ,仔细想想,然后去试试敲一敲 定义一个priority_queue,然后看看到底是什么东西,压进去几个数,再看看每次取队首元素的值是什么。

      感觉贪心的思路很好出,就看怎么模拟了,结合提示,其实真正去看去想这道题的同学,应该有收获的!👍

信息

ID
1195
时间
1000ms
内存
256MiB
难度
6
标签
递交数
54
已通过
18
上传者