https://codeforces.com/problemset/problem/1579/D

题目大意

有 n 个人被邀请参加一个即将召开重要会议。在会议中,任意两个人可以社交,相同的两个人可以社交任意次。

n 个人中,每个人都有一个社交能力值,其中第 i 个人的社交能力值是一个非负整数 ai,它表示这个人可以与另一个人社交的次数。

在一个会议中,产生的社交次数越多,这次会议就会被认为越有效。具体地,一个会议的有效程度为这次会议进行时产生的社交次数。

给你序列 a,求出一次会议的最大有效程度,要求给出任意一种可以产生这个最大有效程度的方案。

贪心思路:

一旦我们选不出 2 个大于 0 的数,就只能结束操作。

于是一个简单的贪心思路:每次选择最大和次大,使它们都 -1。

反证法:

  • 如果不选择最大和次大而是选择其它的数 -1,那么这些被减的数一定比选择最大和次大 -1 更接近 0。

    一旦一个数字被减到 0,那么它在之后的决策中就不可以被选,而选不出 2 个大于 0 的数,就意味着必须结束选择。

    由于我们要最大化选择次数,所以我们希望能选出 2 个大于 0 的数的次数尽可能的多,也就是使得可以被选择的数的数量尽可能多。

    而选择非最大、次大的数会导致可以选择的数的数量更快的减小,故选择最大、次大两个数一定不会更劣。

    综上,每次贪心的选择最大、次大两个数是正确的。

  • 然后维护最大和次大用优先队列即可

代码实现:

#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>using namespace std;
#define pi acos(-1.0)
#define endl '\n'
#define x first
#define y second
typedef long long LL;
typedef pair<int, int> PII;void solve()
{priority_queue<PII> pq;  // 优先队列值为优先vector<PII> vv;  // 存答案int n,c;LL ma = 0;  // 谈话次数cin >> n;for (int i = 1; i <= n; i ++ ){cin >> c;pq.push({c,i});  // 存值和下标}PII m1, m2;while(1){m1 = pq.top();pq.pop();m2 = pq.top();pq.pop();if(m2.x == 0 || m1.x == 0) break;  // 当出现0即没有答案,跳出vv.push_back({m1.y,m2.y});  // 存答案ma ++;m1.x -= 1; m2.x -= 1;pq.push(m1);pq.push(m2);}cout << ma << endl;for(LL i = 0; i < vv.size(); i ++) cout << vv[i].x << " " << vv[i].y << endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);int T = 1;cin >> T;while(T --){solve();}return 0;
}

CF1579D (1400) 贪心+优先队列相关推荐

  1. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  2. 1163 最高的奖励(贪心+优先队列)

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突 ...

  3. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 1 /* 2 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 3 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小, ...

  4. 贪心(优先队列) - New Year Snowmen - CodeForces - 140C

    贪心(优先队列) - New Year Snowmen - CodeForces - 140C 题意: 给定一个长度为n的正整数序列a1,a2,...,an.给定一个长度为n的正整数序列a_1,a_2 ...

  5. CodeForces 140C New Year Snowmen (贪心+优先队列)

    题意:n个数,选三个严格下降的数为一组,求最多能选多少组,并列出每组哪些数. 题解:贪心+优先队列 最多能选多少组,那么必须贪心数量多的. 例如:1 1 2 3 4 5 如果按照数的大小排序,只能贪到 ...

  6. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

  7. 【BHOJ 女娲加农炮 |、||】贪心 | 优先队列 | 堆 | E

    这次我们通过两道例题来总结一下优先队列的用法和实现: 目录: [BHOJ 1512]女娲加农炮 [BHOJ 1517]女娲加农炮II [BHOJ 1512]女娲加农炮 核心:贪心 + 优先队列 URL ...

  8. codeforces D. Fedor and coupons 贪心+优先队列

    题目地址:点击打开链接 D. Fedor and coupons time limit per test 4 seconds memory limit per test 256 megabytes i ...

  9. 小A与任务 (贪心 优先队列)

    题目链接:小A与任务 题意: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 xi 的时间,同时完成第 i 个任务的时间不能晚于 ...

最新文章

  1. 零基础学习Python需要注意的几个点,Python培训机构排名
  2. 位置偏移问题 绘制_AutoCAD教程之绘制螺栓连接组合图
  3. 史上最正确的achemy安装方法
  4. jquery学习之1.20-获取同辈元素和子元素
  5. hive的udf,udaf,udtf各自依賴兩種class(转载+分析整理)
  6. 小程序--显示图形效果
  7. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(NumPy科学计算库<2>python)
  8. java : jstack 显示虚拟机的线程快照
  9. 《Qt 数据库详解》博客系列文章
  10. Recursion and Tail Recursion in Java and Erlang
  11. nginx的基本使用和反向代理,地址重写问题
  12. 遇到一个奇怪的问题——关于VS2013、VS2015中字符集(多字节字符集和Unicode字符集)的选择
  13. 新装linux系统没有网卡驱动的解决方法
  14. 35岁前要培养的66种思维(中)
  15. S32K144之SDK版:FTM定时器(测试打印系统信息)
  16. 1. ARMv9-A Overview
  17. canvas初体验-图片上画方框
  18. 《牧畜王国的兴衰》序
  19. Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑
  20. 机械革命蛟龙p一堆小问题

热门文章

  1. 华为S9306 如何进行访问控制配置
  2. c语言算法求约数个数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  3. 杰信项目第三天知识点(工作表模板+动态生成目录+动态生成重名文件+购销合同增删改查)
  4. 这招PDF合并方法,一直用一直爽,你绝对需要
  5. HttpURLConnection接口使用案例-图片下载
  6. 弱电系统服务器是什么意思,弱电机房
  7. 基于WEB工作流管理系统的设计与实现
  8. 【互联网+“创新创业大赛”】智慧课堂项目计划书
  9. 京东暂停天天快递,消费者是最大的赢家
  10. 计算长方形的周长和面积(类和对象)python