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】舞蹈课的更多相关文章

  1. 洛谷 P1878 舞蹈课 解题报告

    P1878 舞蹈课 题目描述 有\(n\)个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始 ...

  2. 舞蹈课(dancingLessons)

    有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...

  3. 【笔记】CF1251E Voting 及相关

    题目传送门 贪心: 一个人 \(i\) 要投票,两种情况:花钱,或当前的人数达到了 \(m_i\). 而当前达到 \(m_i\) 的话所有 \(m_j \le m_i\) 也就达到要求了. 所以考虑将 ...

  4. 二模01day1解题报告

    T1.音量调节(changingsounds) 有n个物品的背包(有点不一样,每个物品必须取),给出初始价值,物品价值可正可负(就是两种选择嘛),求可能的最大价值,不可能(<0或>maxs ...

  5. Bruce Eckel:编程生涯(转载)

    Bruce Eckel:编程生涯(转载) 说明:Bruce Eckel 著有大名鼎鼎的<Thinking in C++>和<Thinking in Java>.本文是他对程序员 ...

  6. 01day1

    最大音量 动态规划 题意:给出一个初始值和一个变化序列 c,在第 i 步可以加上或减去 c[i],求 n 步之后能达到的最大值.有一个限定值 maxlevel,在变化过程中值不能超过 maxlevel ...

  7. 9.29noip模拟试题

    环上的游戏(cycle) 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这 ...

  8. TED Talk-教育如何扼杀创造力

    TED上面有个"11个必须看的TED演讲"的播放列表,"教育扼杀创新"是其中一个.下面贴的是演讲的中文翻译. 早上好. 前面的演讲都很好,对不对? 我已经完全被 ...

  9. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

随机推荐

  1. python中根据时间获取周数,通过周数获取时间

    # 时间## 时间和周数 import time import datetime # 获取今天是第几周 print(time.strftime('%W')) # 获取当前是周几(0-6,0代表周一) ...

  2. RSA学习1

    对PEM文件(以前是一个邮件编码)进行编码,得到RSA公钥.国密的RSA标准,一般是tlv(tag-version)格式的. 明文hash后的数据进行BER编码再进行加密.-签名 对于RSA的结构,全 ...

  3. 阿里云和微软共同开源的 OAM 对 Kubernetes 开发人员意味着什么?

    上周,微软和阿里巴巴共同推出了开放应用模型(OAM),用于定义部署在任何地方的应用模型的一种规范.Rudr是Microsoft基于Kubernetes环境的OAM标准实现. 我用了一个周末来了解OAM ...

  4. Centos7 基础命令与软件的安装

    本人小白一枚正在老男孩培训,所以从现在开始把我学到的知识都分享给大家,该随笔会一直更新 centos7基础命令与软件 ps:命令与参数之间必须加上空格,安装成功时最后一行会有  Complete!   ...

  5. Spring Boot实战之定制URL匹配规则

    本文首发于个人网站:Spring Boot实战之定制URL匹配规则 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符". ...

  6. Appium的加载过程

    appium运行流程 Appium的加载过程如上图. 1)调用Android adb完成基本的系统操作: 2)向Android上部署bootstrap.jar: 3)Bootstrap.jar For ...

  7. python super原理,不是指父类

    class a(object): def __init__(self): print('in a') class b(a): def __init__(self): print('in b') sup ...

  8. 消息中心 - Laravel的Redis队列(一)

    前言 Laravel的队列可以用在轻量级的队列需求中.比如我们系统中的短信.邮件等功能,这些功能有一些普遍的特征,异步.重试.并发控制等.Laravel现在主要支持的队列服务有Null.Sync.Da ...

  9. 大数据之路day01_2--记事本与EditPlus编写Hello World并且运行

    在上一节我们成功的安装JAVA并且将其环境配置成功,接下来我们来编写第一个java程序——Hello World 1.利用记事本编写代码,利用命令行来编译运行 (1)新建记事本,(文件名).java后 ...

  10. python入门递归之汉诺塔

    def hani(n,x,y,z): if n == 1 : print(x ,"-->",z) else: hani(n-1,x,z,y)#将n-1个盘子从x移到y pri ...