P1878 舞蹈课(详解)c++

题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态

1.题目解析

          

                                             

1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根据题目找到1这个最小差值后,输出这一对舞伴的编号即下标3和4,再输出队列里面还剩的另一队舞伴的编号1和2,这里成功出列了两对舞伴,所以先输出总对数2再输出3 4再输出1 2

                            

2.算法原理

解法:利用小根堆存所有相邻异性的差值,然后每次拿出最小的即可

                                                 

举个例子,把全部相邻异性的差值算出来之后,拿最小的差值,此时最小的差值是2,根据题目如果不止一对,那么最左边的那一对出列,所以让2号3号舞伴出列,接着继续让下一个差值最小的舞伴出列,这个想法很正确,就是利用堆存放相邻异性的差值,然后每次拿出最小的就行了,但是这个想法会很多问题                  

1.取出相邻的一对异性之后,他们的左右,有可能变成新的一对

比如现在让最小差值为2的一对舞伴出列,原来在他们左边的男生和右边的女生会组成一对新的舞伴,如何能做到快速地删除完一个之后,还能把左右两个连接起来呢,就可以利用双向链表存队列

                                                    

比如2和4舞伴出列后,让10指向7,7指向10就可以得到一个新队列,利用双向链表存队列,就可以实现删除一对舞伴后,只需修改指针,就可以快速地确定另一个,并且把新的队列还原出来

                                             

2.堆中,有可能存在已经出列的人
堆中存放这5个差值8 2 3 2 8,最小差值为2的一对舞伴出列后,1号和4号舞伴产生新的差值3,并把它放到堆里,2号,3号舞伴出列后,8和3就变成了无效元素,但它们还在堆里,此时我拿出3,再输出下标,就有可能出错,所以要杜绝这种情况,创建一个bool数组标记一下即可;true表示出列,false表示没出列,假如我把3拿出来,再判断他对应的舞伴3和4是否有出列的情况,如果有就不对这个3进行处理

3.堆中存什么?
我们要知道技术差以及左边的人是谁以及右边的人是谁,<技术差,左编号,右编号>,这样就能还原双向链表,把技术差拿到,知道左编号和右编号,通过修改指针就可以还原

代码

//舞蹈课
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>using namespace std;const int N = 2e5 + 10;int n;
int s[N]; //标记男女 - 1/0//双向链表存数据
//数据是从左向右依次进来的,4的右边就是2,2的左边就是4,
//直接把它定义出来就行了,就不需要h,id这些指针了
int e[N];
int pre[N], ne[N];struct node {int d; //技术差int l, r; //左右编号//小根堆,大元素下坠 bool operator <(const node& x) const{//根据题目如果不止一对,那么最左边的那一对出列//可以知道技术差有可能相等,所以技术差相等的时候可以根据左编号定义小根堆if (d != x.d) return d > x.d;else return l > x.l;}
};priority_queue<node> heap;
bool st[N]; //标记已经出列的人int main()
{cin >> n; for (int i = 1; i <= n; ++i){char ch; cin >> ch;if (ch == 'B') s[i] = 1;}for (int i = 1; i <= n; ++i){cin >> e[i];//直接创建双向链表pre[i] = i - 1;ne[i] = i + 1;}ne[n] = 0; //0表示后面没有元素//1.先把所有的异性放进堆里for (int i = 2; i <= n; ++i){//如果当前性别和前一个人的性别不一样if (s[i] != s[i - 1]){heap.push({ abs(e[i] - e[i - 1]), i - 1, i });}}//2.提取结果//我们最后要先输出有多少对出列,所以要先把结果存起来vector<node> ret; //暂存结果//堆里还要异性就一直出列while (heap.size()){node t = heap.top(); heap.pop();int d = t.d, l = t.l, r = t.r;//l、r其中任何一个标记ture,说明对应的位置里有人已经出列了if (st[l] || st[r]) continue;ret.push_back(t);st[l] = st[r] = true; //标记l或r已经出列//维护双向链表ne[pre[l]] = ne[r];pre[ne[r]] = pre[l];//判断新的左右是否会成为一对,左和右有可能不存在,判断异性就无意义//如果l的编号是1,1的左边是不存在人的,所以也要判断l/r是否存在int left = pre[l], right = ne[r];if (left && right && s[left] != s[right]){heap.push({ abs(e[left] - e[right]), left, right });}}cout << ret.size() << endl;	for (auto& x : ret){cout << x.l << " " << x.r << endl;}return 0;
}

也可以用pair存结果

	//暂存结果vector<pair<int, int>> ret;//模拟出列过程while (heap.size()){node t = heap.top(); heap.pop();int d = t.d, l = t.l, r = t.r;if (st[l] || st[r]) continue; //对应舞伴已出列则不处理//记录结果ret.push_back({ l,r }); st[l] = st[r] = true; //标记已出列//更新双向链表int left = pre[l], right = ne[r];ne[left] = right;pre[right] = left;//检查新的相邻是否为异性组合//l和r如果是1或者n,那便没有左边人或右边人if (left && right && s[left] != s[right]){heap.push({ abs(e[left] - e[right]), left , right });}}cout << ret.size() << endl;for (auto& x : ret){cout << x.first << " " << x.second << endl;}

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

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

相关文章

基于HAL库的按钮实验

实验目的 掌握STM32 HAL库的GPIO输入配置方法。 实现通过按钮控制LED亮灭&#xff08;支持轮询和中断两种模式&#xff09;。 熟悉STM32CubeMX的外部中断&#xff08;EXTI&#xff09;配置流程。 实验硬件 开发板&#xff1a;STM32系列开发板&#xff08;如STM32F103C8T6、N…

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等&#xff0c;载体&#xff08;特别是涉密载体&#xff09;是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…

Spring Cloud-Sentinel

Sentinel服务熔断与限流 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。 官网地址&#xff1a;home | Sentinelhttps://sen…

土星云边缘计算微服务器 SE110S-WA32加持DeepSeek,本地部署企业私有推理大模型!

模型介绍 DeepSeek-R1-Distill-Qwen-7B是一款高性能的语言模型&#xff0c;基于DeepSeek-R1的推理能力&#xff0c;通过蒸馏技术将推理模式迁移到较小的Qwen模型上&#xff0c;在保持高性能的同时&#xff0c;显著降低了资源消耗&#xff0c;更适合在资源受限的环境中部署。 该…

React进阶之React核心源码解析(二)

React核心源码解析 diff单一节点比较diff多节点比较diff两轮遍历比较第一轮比较第二轮比较 Update 状态更新Concurrent Mode diff 一共两个阶段 render&#xff1a;内存中的更新&#xff0c;主要是通过递归的过程&#xff0c;来将react变化的部分&#xff0c;在内存中找到哪些…

安装WPS后,导致python调用Excel.Application异常,解决办法

在使用xlwings编辑excel文件时&#xff0c;默认调用的是“Excel.Application”&#xff0c;如果安装过wps&#xff0c;会导致该注册表为WPS&#xff0c;会导致xlwings执行异常 因为安装过WPS&#xff0c;导致与Excel不兼容的问题&#xff0c;想必大家都听说过。有些问题及时删…

FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 基于AOP的数据字典实现…

鸿蒙面试题

1.0penHarmony的系统架构是怎样的? 2.电话服务的框架? 3.OpenHarmony与HarmonyOS有啥区别?

基于 Filebeat 的日志收集

在现代分布式系统中&#xff0c;日志数据作为关键的监控与故障排查依据&#xff0c;越来越受到重视。本文将深入探讨 Filebeat 的技术原理、配置方法及在 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;生态系统中的应用&#xff0c;帮助开发者构建高效、稳定的日…

wireshark网络抓包

由于图片和格式解析问题&#xff0c;可前往 阅读原文 到这里已经讲了两个抓包工具的使用了&#xff0c;大家应该对抓包不是很陌生了。而wireshark相对于fiddler和charles更加偏向于网络层面的抓包或者说是一个网络封包分析工具。使用对象更适合于网络相关人员(网络管理员/相关运…

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…

bitcoinjs学习1—P2PKH

1. 概述 在本学习笔记中&#xff0c;我们将深入探讨如何使用 bitcoinjs-lib 库构建和签名一个 P2PKH&#xff08;Pay-to-PubKey-Hash&#xff09; 比特币交易。P2PKH 是比特币网络中最常见和最基本的交易类型之一&#xff0c;理解其工作原理是掌握比特币交易构建的关键。 想要详…

2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)

2024年博客之星年度评选—创作影响力评审主题文章创作评审目前排名 2024年博客之星主题文章创作评审文章得分公布&#xff01;2024年博客之星创作影响力评审2024年博客之星主题文章创作评审目前排名公布&#xff01; 【2024博客之星】恭喜完成✅主题创作的226位博主&#xff0…

机器学习-1:线性回归

常用的线性回归模型主要有以下这些 简单线性回归多元线性回归多项式回归岭回归套索回归弹性网络回归逐步回归 一.简单的一元线性回归 1.导入必备的库 #导入必备的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现

给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中&#xff0c;许多文件需要添加水印以标识其状态&#xff0c;例如“受控”“机密”等。对于PDF文件&#xff0c;添加水印不仅可以增强文件的可识别性&#xff0c;还可以防止未经授权的使用。本代码的功能需求是…

java每日精进 2.13 Ganache(区块链本地私有化部署)

需求&#xff1a;使用区块链实现数据村存储&#xff0c;记录一些不可篡改的交互信息&#xff0c;网络环境为内外网均需要部署&#xff1b; 1.准备工作&#xff08;软件安装&#xff09; 1.1 安装 Node.js 和 npm 1.2 安装 Ganache 地址如下&#xff1a;windows有可视化界面 &a…

RAGFlow和Dify对比

‌ RAGFlow和Dify都是基于大语言模型&#xff08;LLM&#xff09;的应用开发平台&#xff0c;具有相似的功能和应用场景&#xff0c;但它们在技术架构、部署要求和用户体验上存在一些差异。‌‌ RAGFlow和Dify对比 2025-02-13 22.08 RAGFlow‌ ‌技术栈‌&#xff1a;RAGFlow…

day9手机创意软件

趣味类 in:记录趣味生活&#xff08;通用&#xff09; 魔漫相机&#xff1a;真人变漫画&#xff08;通用&#xff09; 活照片&#xff1a;让照片活过来&#xff08;通用&#xff09; 画中画相机&#xff1a;与众不同的艺术 年龄检测仪&#xff1a;比一比谁更年轻&#xf…

Next.js 15【实用教程】2025最新版

官网 https://nextjs.org/docs/app/getting-started Next.js 简介 Next.js 由 Vercel 开发和维护&#xff0c;旨在解决单页应用&#xff08;SPA&#xff09;和多页应用&#xff08;MPA&#xff09;在性能和 SEO 上的不足。 核心特性 服务端渲染&#xff08;SSR&#xff09;--…

MySQL 联合索引的最左匹配原则

环境&#xff1a;MySQL 版本&#xff1a;8.0.27 执行计划基础知识 possible_keys&#xff1a;可能用到的索引 key&#xff1a;实际用到的索引 type: ref&#xff1a;当通过普通的二级索引列与常量进行等值匹配的方式 询某个表时const&#xff1a;当我们根据主键或者唯一得…