舞蹈课(dancingLessons)
有n个人参加一个舞蹈课。每个人的舞蹈技术由整数ai来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果相差最小的不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为ABCD,那么BC出列之后队伍变为AD)。舞蹈技术相差最小即是ai差的的绝对值最小。
你的任务是,模拟以上过程,确定跳舞的配对及顺序。
输入
第一行为正整数n(<=n<=*^)为队伍中的人数。
下一行包含n个字符B或者G,B代表男,G代表女。
下一行为n个整数ai(ai<=^)。
所有信息按照从左到右的顺序给出。
在50%的数据中,n<=。
输出
第一行:出列的总对数k。接下来输出k行,每行是两个整数。按跳舞顺序输出,两个整数代表这一对舞伴的编号(按输入顺序从左往右1至n编号)。请先输出较小的整数,再输出较大的整数。
样例输入1 BGBG 样例输出1 样例输入2 BGBB 样例输出2
问题描述
解:50%的做法,直接模拟就可以了
正解:乱搞
想办法将模拟过程优化
主要分为两个优化,
1)将找最小值部分优化,
将所需信息用结构体记录下来,
用优先队列按照题目要求排序
2)将相邻两个人之间的关系用链表维护,
这样在出队时的关系维护可以做到O(1)
剩下的细节自己想(看代码)。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<queue>
#include<cmath>
using namespace std;
const int N=2e5+;
struct node{
int c,l,r;
bool operator < (const node &x) const{
if(c!=x.c) return c>x.c;
else return l>x.l;
}
}e[N],g[N];
priority_queue<node>q;
int n,a[N],L[N],R[N];
int k,qc,ql,qr;
bool v[N];
char s[N];
bool ok(int x){return (x>= && x<=n);}
int main()
{
freopen("dancingLessons.in","r",stdin);
freopen("dancingLessons.out","w",stdout);
scanf("%d",&n);scanf("%s",s+);
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);
L[i]=i-;R[i]=i+;
}
for(int i=;i<=n;++i)
if(s[i]!=s[i-])
q.push((node){abs(a[i]-a[i-]),i-,i});
while(!q.empty())
{
qc=q.top().c;ql=q.top().l;
qr=q.top().r;
if(v[ql] || v[qr])
{
q.pop();continue;
}
v[ql]=v[qr]=;
g[++k]=q.top();q.pop();
L[R[qr]]=L[ql];R[L[ql]]=R[qr];
if(ok(L[ql]) && ok(R[qr]))
if(s[L[ql]]!=s[R[qr]])
{
qc=abs(a[L[ql]]-a[R[qr]]);
ql=L[ql];qr=R[qr];
// cout<<ql<<" "<<qr<<endl;
q.push((node){qc,ql,qr});
}
}
printf("%d\n",k);
for(int i=;i<=k;++i)
printf("%d %d\n",g[i].l,g[i].r);
return ;
}
舞蹈课(dancingLessons)的更多相关文章
- 洛谷 P1878 舞蹈课 解题报告
P1878 舞蹈课 题目描述 有\(n\)个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始 ...
- 【Luogu P1878】舞蹈课
Luogu P1878 事实上这道题并不难,但我真没弄懂我手写堆为什么过不了.所以 STL大法好!!! 基本思路 对于每一对相邻异性,将他们的舞蹈技术的差插入一个堆 通过维护这个小根堆,每次就可以取得 ...
- 9.29noip模拟试题
环上的游戏(cycle) 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这 ...
- 2014-9-13 NOIP模拟赛
NOIP2014模拟赛 ——lwher 题目名 环上的游戏 舞蹈课 数位和乘积 源文件 cycle.cpp/c/pas dancingLessons.pas/cpp digit.cpp.cpp/c/p ...
- 二模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 ...
- TED Talk-教育如何扼杀创造力
TED上面有个"11个必须看的TED演讲"的播放列表,"教育扼杀创新"是其中一个.下面贴的是演讲的中文翻译. 早上好. 前面的演讲都很好,对不对? 我已经完全被 ...
- 20165318 预备作业二 学习基础和C语言基础调查
20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...
随机推荐
- 【MM系列】SAP 在SAP中更改基本计量单位
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 在SAP中更改基本计量单位 ...
- 【Qt开发】QT中显示图像数据
一般图像数据都是以RGBRGBRGB--字节流的方式(解码完成后的原始图像流),我说成字节流,那就表明R,G,B的值各占一个字节,在编程时表示的就是unsigned char * data. 我们先来 ...
- /etc/syscofig/network 修改主机名
[root@mysql ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=mysql
- 获取程序所有加载的dll名称
1.在任务管理器输入如下指令.输出到文件:tasklist /m >c:\dll.txt 输出到命令行 tasklist /m 2.使用工具软件https://files.cnblogs.com ...
- java基础笔记(8)
java的多线程 进程:程序的执行过程,持有内存资源 线程:是系统的最小执行单元,共享进程的资源 线程之间可以互斥.也可以同步: Thraed类: 通过一个案例来了解线程Thread类和Runnabl ...
- H264 RTP包解析
1. 预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码. h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流 ...
- tabcontrol动态生成选项卡,并且在选项卡中添加窗体
http://blog.csdn.net/zx13525079024/article/details/6084733 今天在论坛上看到有人问到,如果在点击TRVEVIEW时动态生成tabcontrol ...
- Excel批量插入的SQL Server
首先新建一个WPF的项目,名为ExcelToServerDemo 到Nuget去安装NPOI的Nuget包,点击安装即可,会自动引用项目. 新建一个Student的表格,有名字,年龄,性别,地址,以及 ...
- Nginx的端口修改问题
转自:https://www.cnblogs.com/fengyuhuawu/p/7867728.html 修改 nginx.conf 文件实现. 在 Linux 上该文件的路径为 /usr/loca ...
- 2019-11-28-win10-uwp-提示-Cannot-find-a-Resource-with-the-Name-Key-找不到资源
title author date CreateTime categories win10 uwp 提示 Cannot find a Resource with the Name Key 找不到资源 ...