CF1579D Productive Meeting 黄 题解

news/2025/3/4 20:52:14/文章来源:https://www.cnblogs.com/M-CI/p/18751400

题目传送门

Part1. 思路

这一题要找到交流次数最多的一组答案,所以理所当然地想到要尽可能的多用交流次数。

所以要尽可能的多匹配还有交流次数的人去交流。

但是如果随便匹配,就会出现这样的情况:

1
3
1 2 3

这组数据的答案很明显:

3
1 3
2 3
2 3

假如随便匹配,就可能得到这样的答案:

2
1 2
2 3

出现这种情况的原因是什么呢?

很容易发现,随便匹配得出的过程中,在前两人已经用完交流次数时,交流次数最多的第 \(3\) 个人的交流次数还有 \(2\),很明显没有物尽其用,出现了浪费。

所以需要尽量规避这种情况。

然后就会想到让交流次数最多的两人进行交流,来获得最多的交流次数。

这时候就又会有两种不同的想法:

  1. 将交流次数最多的两人中交流次数较少的那个人的交流次数用完,再找新的交流次数最多的两人。

  2. 将交流次数最多的两人的交流次数各使用 \(1\),然后找新的交流次数最多的两人。

如果使用想法一,在下面的数据中就会出错:

1
5
5 5 5 5 5

正确答案为:

12
4 5
2 3
1 5
3 4
1 2
4 5
2 3
1 5
3 4
1 2
4 5
2 3

但是用想法一得出的答案是:

10
4 5
4 5
4 5
4 5
4 5
2 3
2 3
2 3
2 3
2 3

很明显,有一个人的交流次数完全没有使用,完全被浪费。

所以也需要避免出现这种情况。

现在我们便得到了正解:

维护一个大根堆,将所有的有交流次数的人压入队列,当队列中还至少有两个人时,将队首的两人弹出,将他们的交流次数 \(-1\),如果还有剩余的交流次数,就再将它们压回队列。

Part2. 代码

#include <bits/stdc++.h>
using namespace std;int t,n,ans,a[200010];
pair<int,int> tot[200010];int main () {cin>> t;while (t--) {cin>> n;priority_queue<pair<int,int> > q;for (int i=1;i<=n;i++) {cin>> a[i];if (a[i]>0) q.push ({a[i],i});}ans=0;while (q.size ()>=2) {pair<int,int> u=q.top ();q.pop ();pair<int,int> v=q.top ();q.pop ();tot[++ans]={min (u.second,v.second),max (u.second,v.second)};u.first--;v.first--;if (u.first) q.push (u);if (v.first) q.push (v);}cout<< ans<< "\n";for (int i=1;i<=ans;i++)cout<< tot[i].first<< " "<< tot[i].second<< "\n";}return 0;
}

AC记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF2068H. Statues

CF2068H. Statues 构造题. 思路 我们设 \(d_0 = a + b\) 是第 1 座雕像到第 \(n\) 座雕像的距离. 那么首先可以注意到两个必要条件:\(\displaystyle \sum_{i = 0}^{n - 1} d_i\) 为偶数. 对于 \(\forall i \in [0, n - 1]\), 都有 \(d_i \le d_0 + \dots + d_{i - 1} + d_{i + …

WEB攻防-机制验证篇重定向发送响应状态码跳过步骤验证码回传枚举

笔记: 验证码突破:回传的时候泄露了发送的验证码导致不需要知道目标的验证码是多少直接使用数据包里面的队列 规律爆破:就是常见的数字四位或者六位 10000 种可能在规定时间内爆破或者多次验证后网站不会出现新的验证码没有次数限制可以尝试爆破或者是汉字进行 重定向用户:通过…

Docker 安装 Redis 容器

1、下载Redis镜像下载指定版本的Redis镜像 (xxx指具体版本号) docker pull redis:xxx docker pull redis 下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis:latest ),我用5.0.5版本。docker pull redis:5.0.52、 检查当前所有Docker下载的镜像docker images

Script-Server:用Web UI轻松管理你的脚本执行

# 监控 # 运维人员 在现代软件开发和运维中,脚本的使用频繁而广泛。然而,如何让非技术人员轻松、安全地运行这些脚本成为了一个挑战。 幸运的是,Script-Server应运而生,它是一个为脚本提供的Web用户界面,可以让用户通过一个直观的界面执行各种脚本,而无需编写代码。本文…

nuxtjs + scss + unocss + pinia 新建项目

1、通过命令行报错的,直接下载压缩包 pnpm dlx nuxi init <project-name>压缩包地址:https://codeload.github.com/nuxt/starter/tar.gz/refs/heads/v3 2、安装插件 1、安装unocss pnpm install --save-dev @unocss/nuxt unocss# nuxt.config.jsmodules: [@unocss/nuxt…

【Azure 环境】执行 az ad user show –id 报错 Insufficient privileges to complete the operation

执行 az ad user show –id 报错 Insufficient privileges to complete the operation问题描述 本地环境中,执行 az ad user show -id 时候,报错 insufficient privileges to complete the operation !问题解答 此报错说明,登录Azure (az login) 时,所使用的账号权限不足所…

VMware ESXi 8.0U3d macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:…

VMware Fusion 13.6.3 OEM BIOS 2.7 - 在 macOS 中运行 Windows 虚拟机的最佳方式

VMware Fusion 13.6.3 OEM BIOS 2.7 - 在 macOS 中运行 Windows 虚拟机的最佳方式VMware Fusion 13.6.3 OEM BIOS 2.7 - 在 macOS 中运行 Windows 虚拟机的最佳方式 VMware Fusion 13 原版 App 中集成 OEM BIOS 请访问原文链接:https://sysin.org/blog/vmware-fusion-13-oem/ …

VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途

VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途 VMware Workstation 17.6.3 Pro for Windows & Linux - 领先的免费桌面虚拟化软件 基于 x86 的 Windows、Linux 桌面虚拟化软…

[51Nod 1558] 树中的配对

前言 这能不会, 这能不会, 这能不会??? 做了一会之后, 感觉确实可以不会 思路题意 带权树求一组排列 ppp 使得 dis(i,pi)→max⁡\textrm{dis} (i, p_i) \to \maxdis(i,pi​)→max结论 一条边最多的经过次数就是其连接的两部分中较小的那一个证明方法 \(1\) 调整法 首先点对初…

微信小程序快递代理新手必看:3种方法轻松上手

很多朋友都在问我,如何开始快递代理业务。其实,这个兼职工作门槛很低,只要你有空闲时间,就能开始赚钱。下面我给大家分享一下具体的操作方法。 首先可以让客服帮你搭建小程序,这样推广就可以自助让客户下单,是需要推广!以后客户用了就能一直下单获取持续收益了。 快递代…

2025.03.04 CW 模拟赛 A. 树

题面 A. 树 思路 先说结论, 每条边的贡献次数等于其左右两侧子树大小的最小值. 证明#include "iostream" #include "vector"using namespace std;typedef pair<int, int> pii; typedef long long ll;constexpr int N = 2e5 + 10;int n, sz[N]; ll an…