【Luogu P1878】舞蹈课

P1878 舞蹈课 一个不错的入门级的数据结构练习题,练习了链表和堆两种入门数据结构,难度在黄题里面是偏难的,这个题的关键点就是要想到用堆来维护每一对男女,只要想到这个,这个题就不难了,输入的时候往堆里面插入元素,然后遍历输出,输出了一对人,要用散列数组表示这一对人已经处理过了,同时也要判断需不需要往堆里面加入新的元素,总之这个题一开始看的时候没有想起来,过了这个久终于过了这个题。 阅读详情

Luogu P1878
一个早上的战果
事实上这道题并不难,但我真没弄懂我手写堆为什么过不了。所以

STL大法好!!!

基本思路

对于每一对相邻异性,将他们的舞蹈技术的差插入一个堆
通过维护这个小根堆,每次就可以取得舞蹈技术差最小的一对
值得注意的是,每次取完一对舞伴之后,要对这对舞伴进行标记,并将堆中所有有这两位舞者参与的舞伴弹出这个堆。并且还需要找到这一对舞伴两边的第一个未被挑出的人,如果是异性则可以作为新的舞伴加入堆

代码

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
struct data
{
	int l,r,val;
	bool operator <(const data&x) const
	{
		if (x.val!=val) return x.val<val;
		else return x.l<l;	
	}//重载运算符 
};
int len,n,que[200005],a[200005],ans,group1[200005],group2[200005],rlen;
bool choice[200005];
priority_queue <data> heap;
int main()
{
	scanf("%d\n",&n);
	for (int i=1;i<=n;i++)
	{
		char c;
		scanf("%c",&c);
		if (c=='B') que[i]=true;//对男生进行标记 
	}
	scanf("%d",&a[1]);
	for (int i=2;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if (que[i]!=que[i-1]) //可以组成舞伴则进堆 
		{
			data rec;
			rec.l=i-1;rec.r=i;
			rec.val=abs(a[i]-a[i-1]);
			heap.push(rec);
		}
	}
	while (!heap.empty())
	{
		data rec=heap.top();
		ans++;
		group1[ans]=rec.l;
		group2[ans]=rec.r;
		choice[rec.l]=choice[rec.r]=true;//打上标记 
		while (choice[rec.l]||choice[rec.r])
		{
			if (heap.empty()) break;
			heap.pop();
			rec=heap.top();
		}//这一个循环的目的就是使堆顶元素是没有被选过的 
		int l=group1[ans];int r=group2[ans]; 
		while (l>0&&choice[l]) l--;
		while (r<=n&&choice[r]) r++;
		//寻找两边未被选的人 
		if (que[l]!=que[r]&&l>0&&r<=n) 
		{
			rec.l=l;
			rec.r=r;
			rec.val=abs(a[l]-a[r]);
			heap.push(rec);
		}
	}
	printf("%d\n",ans);
	for (int i=1;i<=ans;i++) printf("%d %d\n",group1[i],group2[i]);
	return 0;
}
shader基于高度的权重混合 效果图: 基于高度的权重混合 , 效果描述: (1)混合:三层混合, 例如 第一层是草,第二层是石头,第三层是沙子,三者混合显示 (2)权重: 三层的权重的和 为1, 三者是此消彼长的关系 (3)高度:高度会限制或者说是 束缚 着 效果 关于混合,再多说几句: (1)基于权重的混合:权重 ,跟顺序没有关系 只跟权重的大小有关系(在一层一层界限不清晰的地方,特别适用!!效果极好!!!!) (2)基于叠加的混合: 叠加 就是 一层一层的往上加。。。。 所以顺序特别重要(在雪地等效果中使用:因为 阅读详情

相关推荐

xenomai内核解析--嵌入式实时linux概述

Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪。更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多种处理器、开发板,提供多种软件开发工具,同时Linux系统对网络和图形界面的支持非常出色。显然,选择Linux操作系统在产品的开发周期和成本控制方面都有巨大优势。 虽然Linux系统功能强大、实用性强...

wsg1100 3699

P1878 舞蹈课(二叉堆)

P1878舞蹈课https://www.luogu.com.cn/problem/P1878 #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <cstring> #include &.

Ghostttttttiii的博客 339

STM32驱动AS5600磁性旋转位置传感器模块

文章目录简介引脚定义I2C接口写数据读数据从指定的地址开始读数据驱动程序cubeMX配置驱动程序`bsp_as5600.h``bsp_as5600.c`测试程序参考资料 简介 AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。 引脚定义 I2C接口 7位设备地址为0x36(二进制表示为0110110) 支持标准模式和

ApexYuan 1万+

【洛谷】P1878 舞蹈课

#include <iostream> #include <cstdio> #include <queue> using namespace std; //模拟到头痛的一道题 //有一点细节出错就会全WA,自己思考不够全面细致的问题在这道题暴露的淋漓尽致 //解题思路: //建堆,然后每次得到差值最小的pop,再从两边找没有出列过的,并且异性的两个 #define abs(x) (x) < 0? -(x) : (x) inline void read(int .

m0_52995942的博客 363

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4033

【算法随笔 Luogu: P1878 舞蹈课】(优先队列 | 断链重连 | 链式)

typedef struct {//定义一对节点int diff;//每一对的水平差距int first;//第一个人的编号//第二个人的编号} node;//记录每个人是否出队(是否有效)//只有label为假,即还没有出队时访问prev和next才有意义//动态记录每个人的前驱//动态记录每个人的后继int N {};//每个人的水平//一共有多少对//组成的每一对的第一个和第二个人i < N;

RFoer的博客 709

Ultralytics 框架中predict 与 track 的区别

在 Ultralytics 框架中,predict 和 track 是两种不同的推理方法,分别用于目标检测(或分割、姿态估计)和目标跟踪任务。

浩瀚之水的专栏 1126

P1878 舞蹈课(详解)c++

我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根据题目找到1这个最小差值后,输出这一对舞伴的编号即下标3和4,再输出队列里面还剩的另一队舞伴的编号1和2,这里成功出列了两对舞伴,所以先输出总对数2再输出3 4再输出1 2。比如2和4舞伴出列后,让10指向7,7指向10就可以得到一个新队列,利用双向链表存队列,就可以实现删除一对舞伴后,只需修改指针,就可以快速地确定另一个,并且把新的队列还原出来。

weixin_73266891的博客 969

支持向量机算法之鸢尾花特征分类【机器学习】

支持向量机(SVM)是一种二元分类模型。它的基本模型是在特征空间中定义最大区间的线性分类器,这使它不同于感知器;支持向量机还包括核技术,这使得它本质上是一个非线性分类器。支持向量机的学习策略是区间最大化,它可以形式化为求解凸二次规划的问题,等价于正则化铰链损失函数的最小化。支持向量机的学习算法是求解凸二次规划的优化算法。Scikit learn(sklearn)是机器学习中常见的第三方模块。它封装了常见的机器学习方法,包括回归、降维、分类、聚类等。实例的特征向量(以2D为例)映射到空间中的一些点,如下图中的

一键难忘的博客 4970

基于pytorch cnn ResNets卷积网络的模糊图像检测 完整代码数据直接运行

基于pytorch cnn ResNets卷积网络的模糊图像检测 完整代码数据直接运行

730

洛谷题单【数据结构2-1】二叉堆与 ST 表

自留档

Tracy_yi的博客 429

Unity与iOS原生交互实战指南

C#(DllImport) → C 接口(extern "C") → Objective‑C / SwiftObjective‑C → UnitySendMessage → C#(GameObject + public 方法)在写.mm文件;在里面写;C# 用声明;调用它,参数就是 string / 数值等;在.mm里做你想做的 iOS 原生操作。在 Unity 里准备一个常驻 GameObject,比如;上面挂一个脚本,写;在 iOS 插件中用;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1357

P1878 舞蹈课(堆+双链表

一开始我是想只存左点,然后根据r[i] 求 右边的点,但是由于你当时入堆时的值 是 对应的x,y。如果y先被删掉,x就和别的 点连起来了。大概就是这样,用双链表维护整个序列。堆中要存三个元素,值 x,y。维护双链表的正确用法,

m0_75125820的博客 380

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

洛谷在线测试P1878_舞蹈课

/* Name: P1878_舞蹈课 Copyright: Author: 巧若拙 Date: 01-03-17 07:42 Description: 有n个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。 当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。 如果不止一对,那么最左边的那一对出列。一对异性出

QiaoRuoZhuo的专栏 1627

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

《P1878 舞蹈课》

这是一个模拟舞蹈配对的算法问题。题目要求处理n个人组成的队列,每次找出相邻异性且技能差值最小的配对出列,直到没有符合条件的配对为止。程序首先读取人员性别和技能值,然后循环查找候选配对:1) 扫描队列寻找所有相邻异性对;2) 计算技能差值;3) 选择差值最小(相同则取最左)的配对;4) 记录配对并从队列移除。最终输出配对总数和按顺序排列的配对编号(保持原输入顺序)。算法使用优先队列和动态维护数组实现高效处理,时间复杂度为O(n^2),适用于大规模数据(n≤2×10^5)。

Jasmine_llq的博客 668

优先级队列:舞蹈课

细节题

2403_86817821的博客 323

洛谷 P1878 舞蹈课 —— 小顶堆

小顶堆

天翼之城的博客 444

舞蹈课(dancinglessons)

舞蹈课(dancinglessons) 洛谷p1878 题目大意 n个人排成一列,给出n个人的性别及a[i]值,每次让a[i]值相差最小的两个异性出列,输出这样的对数及两人的编号。n&amp;amp;amp;lt;=200000。 题解 50分算法 对于第一个问题,只需要输出男生和女生中个数少的那一个,因为最终一定有一方全部出列,不然肯定有男生和女生相邻,就会继续出列。 对于第二个问题,构建一个结构体n...

liuzibujian的博客 1283

洛谷P1878 舞蹈课 贪心 堆

洛谷P1878 舞蹈课贪心 堆 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define GG int 4 #define For(i, j, k) for(register int i=j; i<=k; i++) 5 #define Dow(i, j, k) for(register int ...

weixin_34265814的博客 275

洛谷 P1878 舞蹈课 解题报告

P1878 舞蹈课 题目描述 有\(n\)个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为\(ABCD\),那么\(BC\)出列之后队伍变为\(AD\))。舞蹈技术相差最小即是\(a_i\)...

weixin_30654583的博客 345

舞蹈课 (C++堆的优先级与重载)

第三题:舞蹈课(dancingLessons) 时间限制:1秒 内存限制:256MB 输入:dancingLessons.in 输出:dancingLessons.out 问题描述 有n个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果相差最小的不止一对

nike0good |Oier&ACMer | 熟能生巧 1592

选课,我选了舞蹈和合唱

今天选课,我选了舞蹈表演与欣赏,还有合唱艺术呵呵,抢到的。对于舞蹈一直都是仰望的态度看待,合唱呢,很喜欢大声的喊,所以报了,啊呜,咆哮吧。我喜欢那样。我是个没有伴奏也会唱歌,没有音乐也会起舞的人。买的书,《电子测量仪器》到了,看看先,我身后的示波器我还没用过呢。今天,过得很充实。

able200330的专栏 517

舞蹈课

★实验任务 有 n 个人参加舞蹈课,每个人以他的舞蹈技能 ai 为特点。舞蹈课开始前,他们从左到右排成一行。当队伍中至少含有一名男生和一名女生时,下面的过程会重复进行:站在相邻位置的男女生且舞蹈技能差异最小的开始跳舞。如果有很多对,最靠左边的开始跳舞。跳舞完以后就离开。舞蹈技能的差异为| ai-aj| 。你的任务是找到每一对,并找出是按什么顺序开始跳舞。 ★数据输入 输入

独自远行 923

【集训Day4 动态规划】轮船问题

轮船问题(ship) 【问题描述】 某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。每一对友好城市都希望有一条航线来往,于是他们向政府提出了申请。由于河终年有雾。政府决定允许开通的航线就互不交叉(如果两条航线交叉,将有很大机会撞船)。兴建哪些航线以使在安全条件下有最多航线可以被开通。 【输入格式】(ship.in...

WSR的安全屋 2177
上一篇: 【Luogu P5490】扫描线
下一篇: 本人博客已搬迁至博客园
苟岂
博客等级 码龄10年 20粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值