码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • CF1579D (1400) 贪心+优先队列


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

    题目大意

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

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

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

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

     贪心思路:

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

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

    反证法:

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

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

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

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

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

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

    代码实现:

     

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. #define pi acos(-1.0)
    6. #define endl '\n'
    7. #define x first
    8. #define y second
    9. typedef long long LL;
    10. typedef pair<int, int> PII;
    11. void solve()
    12. {
    13. priority_queue pq; // 优先队列值为优先
    14. vector vv; // 存答案
    15. int n,c;
    16. LL ma = 0; // 谈话次数
    17. cin >> n;
    18. for (int i = 1; i <= n; i ++ )
    19. {
    20. cin >> c;
    21. pq.push({c,i}); // 存值和下标
    22. }
    23. PII m1, m2;
    24. while(1)
    25. {
    26. m1 = pq.top();
    27. pq.pop();
    28. m2 = pq.top();
    29. pq.pop();
    30. if(m2.x == 0 || m1.x == 0) break; // 当出现0即没有答案,跳出
    31. vv.push_back({m1.y,m2.y}); // 存答案
    32. ma ++;
    33. m1.x -= 1; m2.x -= 1;
    34. pq.push(m1);
    35. pq.push(m2);
    36. }
    37. cout << ma << endl;
    38. for(LL i = 0; i < vv.size(); i ++) cout << vv[i].x << " " << vv[i].y << endl;
    39. }
    40. int main()
    41. {
    42. ios::sync_with_stdio(false);
    43. cin.tie(nullptr);
    44. cout.tie(0);
    45. int T = 1;
    46. cin >> T;
    47. while(T --)
    48. {
    49. solve();
    50. }
    51. return 0;
    52. }

  • 相关阅读:
    Sentinel 面试题及答案整理,最新面试题
    基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)
    IDEA问题解决:pom跟external librarie依赖版本不一致
    【物联网】Arduino+ESP8266物联网开发(一):开发环境搭建 安装Arduino和驱动
    基于改进粒子群优化算法的柔性车间调度问题(Python代码实现)
    [Linux] shell条件语句和if语句
    Java设计模式-创建型模式-原型模式
    深度学习实战52-基于医疗大模型与医疗智能诊断问答的运用研究
    ​k8s如何做容器的高可用?
    基于工业无线DTU的空气污染监测防治方案
  • 原文地址:https://blog.csdn.net/qq_62783783/article/details/128092479
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号