舞蹈课(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语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...
随机推荐
- LeetCode.868-二进制距离(Binary Gap)
这是悦乐书的第333次更新,第357篇原创 01看题和准备 今天介绍的是LeetCode算法题中Easy级别的第203题(顺位题号是868).给定正整数N,找到并返回N的二进制表示中两个连续1之间的最 ...
- Django-DRF组件学习-环境安装与配置与序列化器学习
1.DRF环境安装与配置 DRF需要以下依赖: Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) Django (1.10, 1.11, 2.0) DRF是以Django扩展 ...
- 使用cython库对python代码进行动态编译达到加速效果及python第三方包的制作安装
1.测试代码:新建 fib.pyx # coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.cl ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SGU 521 North-East ( 二维LIS 线段树优化 )
521. "North-East" Time limit per test: 0.5 second(s)Memory limit: 262144 kilobytes input: ...
- set(详解)
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- 利用AXI VDMA实现OV5640摄像头采集
利用AXI VDMA实现OV5640摄像头采集 导读:摄像头采样图像数据后经过VDMA进入DDR,通过PS部分控制,经过三级缓存,将DDR中保持的图形数据通过VDMA发送出去.在FPGA的接收端口产生 ...
- MySQL---数据库切分
3.切分 水平切分 水平切分又称为sharding,它是将同一个表的记录拆分到多个结构相同的表中.当一个表的数据不断的增加的时候,sharding是必然的选择,它可以将数据分布到集群的不同节点上, ...
- go 关键字之 defer
我是谁 defer - 顾名思义翻译过来叫 延迟, 所以我们通常称呼 defer func() 这样 defer 后面紧跟的函数为 延迟函数. 作者注: 不过从实际应用来讲, 延迟函数通常用来做一些函 ...
- Lock和synchronized的区别和使用(转发)
今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...