鱼C论坛

 找回密码
 立即注册
查看: 199|回复: 1

代码注释详解

[复制链接]
发表于 2024-1-24 21:53:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <queue>
  7. #define MAXN 200001

  8. int n, m, a[MAXN], b[MAXN];
  9. std::priority_queue<int> q1;
  10. std::priority_queue<int, std::vector<int>, std::greater<int> > q2;

  11. int main() {
  12.     scanf("%d %d", &n, &m);
  13.     for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  14.     for (int i = 1; i <= m; ++i) scanf("%d", &b[i]);
  15.     int now = 1, cnt = 0;
  16.     for (int i = 1; i <= b[now]; ++i) {
  17.         q1.push(a[i]);  //把所有的元素放进来
  18.         while (i == b[now]) {    // 表示全部都放完了,放在了大根堆
  19.             ++cnt;
  20.             while(q1.size() >= cnt) {   
  21.                 int x = q1.top(); q1.pop();
  22.                 q2.push(x);
  23.             }
  24.             int ans = q2.top();
  25.             q1.push(ans), q2.pop();
  26.             printf("%d\n", ans);
  27.             ++now;
  28.         }
  29.     }
  30.     return 0;
  31. }
复制代码
详细一点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-24 21:55:10 | 显示全部楼层
这段代码是一个使用优先队列的例子。下面是对代码注释的详细解释:

  1. #include <iostream>
  2. #include <queue>

  3. #define MAXN 200001

  4. int n, m, a, b;
  5. std::priority_queue<int> q1;  // 定义一个整数类型的大顶堆
  6. std::priority_queue<int, std::vector<int>, std::greater<int>> q2;  // 定义一个整数类型的小顶堆

  7. int main() {
  8.     scanf("%d %d", &n, &m);  // 输入n和m

  9.     for (int i = 1; i <= n; ++i) {  // 循环读取n个数字
  10.         scanf("%d", &a);
  11.         q1.push(a);  // 将数字a加入到大顶堆q1中

  12.         if (q1.size() > m) {  // 如果大顶堆q1的大小超过了m,则将堆顶元素弹出
  13.             q2.push(q1.top());  // 将堆顶元素加入到小顶堆q2中
  14.             q1.pop();  // 弹出堆顶元素
  15.         }
  16.     }

  17.     long long ans = 0;  // 定义一个长整型变量ans表示答案

  18.     while (!q1.empty()) {  // 遍历大顶堆q1中的元素
  19.         ans += q1.top();  // 将堆顶元素加入到答案中
  20.         q1.pop();  // 弹出堆顶元素
  21.     }

  22.     while (!q2.empty()) {  // 遍历小顶堆q2中的元素
  23.         ans -= q2.top();  // 将堆顶元素从答案中减去
  24.         q2.pop();  // 弹出堆顶元素
  25.     }

  26.     printf("%lld\n", ans);  // 输出答案

  27.     return 0;
  28. }
复制代码


这段代码的实现思路是:读取n个整数,并将它们放入一个大顶堆q1中,同时维护一个小顶堆q2,保证q2中的元素始终是q1中最小的m个元素。然后,计算q1中剩余的元素的和,并减去q2中的元素的和,得到最终的答案。

希望这个解释能帮到你!如果有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 17:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表