【Luogu 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;
}
【Luogu P1878】舞蹈课的更多相关文章
- 洛谷 P1878 舞蹈课 解题报告
P1878 舞蹈课 题目描述 有\(n\)个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始 ...
- 舞蹈课(dancingLessons)
有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...
- 【笔记】CF1251E Voting 及相关
题目传送门 贪心: 一个人 \(i\) 要投票,两种情况:花钱,或当前的人数达到了 \(m_i\). 而当前达到 \(m_i\) 的话所有 \(m_j \le m_i\) 也就达到要求了. 所以考虑将 ...
- 二模01day1解题报告
T1.音量调节(changingsounds) 有n个物品的背包(有点不一样,每个物品必须取),给出初始价值,物品价值可正可负(就是两种选择嘛),求可能的最大价值,不可能(<0或>maxs ...
- Bruce Eckel:编程生涯(转载)
Bruce Eckel:编程生涯(转载) 说明:Bruce Eckel 著有大名鼎鼎的<Thinking in C++>和<Thinking in Java>.本文是他对程序员 ...
- 01day1
最大音量 动态规划 题意:给出一个初始值和一个变化序列 c,在第 i 步可以加上或减去 c[i],求 n 步之后能达到的最大值.有一个限定值 maxlevel,在变化过程中值不能超过 maxlevel ...
- 9.29noip模拟试题
环上的游戏(cycle) 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这 ...
- TED Talk-教育如何扼杀创造力
TED上面有个"11个必须看的TED演讲"的播放列表,"教育扼杀创新"是其中一个.下面贴的是演讲的中文翻译. 早上好. 前面的演讲都很好,对不对? 我已经完全被 ...
- 20165318 预备作业二 学习基础和C语言基础调查
20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...
随机推荐
- GC 知识点补充——CMS
之前已经讲过了不少有关 GC 的内容,今天准备将之前没有细讲的部分进行补充,首先要提到的就是垃圾收集器. 基础的回收方式有三种:清除.压缩.复制,衍生出来的垃圾收集器有: Serial 收集器 新生代 ...
- 开发架构+osi七层协议+socket(day26)
目录 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议/OSI七层协议 传输层 网络层 数据链路层 物理连接层 socket 什么是socket 为什么用socket 如何使用 软件开发架构 ...
- web前端面试题(含答案)
HTML+CSS1.对WEB标准以及W3C的理解与认识标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所 ...
- Spring(二)装配Spring Bean
控制反转的概念:控制反转是一种通过描述(在Java中或者是XML或者注解)并通过第三方去产生或获取特定对象的方式. 在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependenc ...
- MarkDown时序图
时序图 语法 ```sequence ``` 标题 title: 我是标题 对象 participant A participant B as b-alias 交互 sequence A->B: ...
- Object 的方法总结
1.Object.create() Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__. 用法:Object.create( proto, [pro ...
- Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required [ IDEA mybatis项目报错 ]
今天笔者用Springboot框架整合Mybatis做一个小小的项目: 代码写完,在运行项目时,IDEA给我报了3处错误: org.springframework.beans.factory.Unsa ...
- Java 计算n对应的二进制位上有几个1,分别在什么位置
Java计算n的二进制位上有几个1,分别在什么位置 public List<Integer> getBinOneCount(int n){ List<Integer> ...
- CSPS模拟 63
每天都考试都快傻了O_o $T1 Median$ 一看就不能从通项上下手.. 那么就是..给你一个序列..区间中位数.. 对顶堆! 爆调2h,心态炸裂. 据说根据鬼畜的函数定义和$mod<=le ...
- zookeeper集群搭建2.7
http://blog.csdn.net/uq_jin/article/details/51513307