有n个人参加一个舞蹈课。每个人的舞蹈技术由整数ai来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果相差最小的不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为ABCD,那么BC出列之后队伍变为AD)。舞蹈技术相差最小即是ai差的的绝对值最小。
你的任务是,模拟以上过程,确定跳舞的配对及顺序。
输入
第一行为正整数n(1<=n<=2*10^5)为队伍中的人数。
下一行包含n个字符B或者G,B代表男,G代表女。
下一行为n个整数ai(ai<=10^7)。
所有信息按照从左到右的顺序给出。
在50%的数据中,n<=200。
输出
第一行:出列的总对数k。接下来输出k行,每行是两个整数。按跳舞顺序输出,两个整数代表这一对舞伴的编号(按输入顺序从左往右1至n编号)。请先输出较小的整数,再输出较大的整数。
样例输入1
4
BGBG
4 2 4 3
样例输出1
2
3 4
1 2样例输入2
4
BGBB
1 1 2 3
样例输出2
1
1 2

问题描述

解:50%的做法,直接模拟就可以了

正解:乱搞

想办法将模拟过程优化

主要分为两个优化,

1)将找最小值部分优化,

将所需信息用结构体记录下来,

用优先队列按照题目要求排序

2)将相邻两个人之间的关系用链表维护,

这样在出队时的关系维护可以做到O(1)

剩下的细节自己想(看代码)。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<string>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 const int N=2e5+1000;
10 struct node{
11     int c,l,r;
12     bool operator < (const node &x) const{
13      if(c!=x.c) return c>x.c;
14      else return l>x.l;
15     }
16 }e[N],g[N];
17 priority_queue<node>q;
18 int n,a[N],L[N],R[N];
19 int k,qc,ql,qr;
20 bool v[N];
21 char s[N];
22 bool ok(int x){return (x>=1 && x<=n);}
23 int main()
24 {
25     freopen("dancingLessons.in","r",stdin);
26     freopen("dancingLessons.out","w",stdout);
27     scanf("%d",&n);scanf("%s",s+1);
28     for(int i=1;i<=n;++i)
29     {
30         scanf("%d",&a[i]);
31         L[i]=i-1;R[i]=i+1;
32     }
33     for(int i=2;i<=n;++i)
34      if(s[i]!=s[i-1])
35       q.push((node){abs(a[i]-a[i-1]),i-1,i});
36     while(!q.empty())
37     {
38         qc=q.top().c;ql=q.top().l;
39         qr=q.top().r;
40         if(v[ql] || v[qr])
41         {
42             q.pop();continue;
43         }
44         v[ql]=v[qr]=1;
45         g[++k]=q.top();q.pop();
46         L[R[qr]]=L[ql];R[L[ql]]=R[qr];
47         if(ok(L[ql]) && ok(R[qr]))
48          if(s[L[ql]]!=s[R[qr]])
49           {
50              qc=abs(a[L[ql]]-a[R[qr]]);
51              ql=L[ql];qr=R[qr];
52 //              cout<<ql<<" "<<qr<<endl;
53              q.push((node){qc,ql,qr});
54          }
55     }
56     printf("%d\n",k);
57     for(int i=1;i<=k;++i)
58      printf("%d %d\n",g[i].l,g[i].r);
59     return 0;
60 }

View Code

转载于:https://www.cnblogs.com/adelalove/p/9097152.html

舞蹈课(dancingLessons)相关推荐

  1. 洛谷 P1878 舞蹈课 —— 小顶堆

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

  2. 计算机微课论文参考文献,微课教学学论文参考文献 微课教学参考文献怎么写...

    精选了[100个]关于微课教学学论文参考文献供您后续的写作参考,在写微课教学论文之前,很多大学生总是被微课教学参考文献怎么写难倒怎么办?请阅读本文! 一.微课教学论文参考文献范文 [1]"零 ...

  3. 高中计算机课代表优秀事迹,开学啦 | 课代表欧弟的优秀事迹

    原标题:开学啦 | 课代表欧弟的优秀事迹 伴随着9月的到来 开学的号角也陆续在各个学校响起~ 欧满斗学校校长麻麻 欧满斗学校开学啦~ 虽然很多学生不想开学,哈哈~ 26分钟前 北斗,花圆满,粑粑,欧弟 ...

  4. 祝我亲爱的天蝎GG生日快乐!+相识3周年小纪念

    作者:快乐de蚂蚁 2005年10月26日我们相识于清华一教 于千万人之中相遇了彼此,你推着车走过来,我站在一教门口 午后温暖的阳光斑斑驳驳的洒在你身上,唇红齿白,羞涩的笑容... 第一次见面的此情此 ...

  5. 才做三个月的新业务,为何唐岩对陌陌直播寄予厚望

    3月15日,陌陌发布了2015年Q4及2015年全年财报.财报显示2015年Q4陌陌净营收达到3950万美元,同比增长113%.不按照美国通用会计准则计量,归属于陌陌的净利润为1180万美元.在公布财 ...

  6. set的用法及短语_人教版九全Unit 14重点短语、重点句型、课文讲解

    点击上方蓝字关注我们 于茫茫书海中,为你寻找更适合自己成长的有效资源和那些锲入心灵的文字.与高人交心,轻松学习,把时间留给更重要的人更重要的事. 精彩就点击右上角分享出去,赠人玫瑰手染余香. 重点短语 ...

  7. 乐山市计算机学校太坑,乐山市计算机学校小规矩成就大素养

    没有规矩,不成方圆.规矩,虽然约束了我们的一些行为,但究其根本是保障了大家的基本利益,使我们的学习.生活.工作有序推进. 在乐山市计算机学校,我们有校规校纪,"十条红线".&quo ...

  8. 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单

    导读:我只能「云入坑」了. 策划:嘉婧.杨柳,插画.视觉:曲枚 36氪×后浪研究所出品 来源:后浪研究所(ID:youth36kr) 60后奶奶,已经快听不懂00后大孙子的爱好了. 要问你们年轻人都玩 ...

  9. 2017年总结-致毕业半年的自己

    转眼间半年过去了,我也已经毕业半年,说实话,感觉2017年,自己的成长还是挺大的,下面对自己做一些总结以及来年的规划.其实我是大三的时候就出来实习了,所以接触社会相对同龄可能比较早点,机遇也可能要好些 ...

  10. 我年薪百万,孩子教育花掉一半

    来源 | 深燃(ID:shenrancaijing) 作者 | 唐亚华 编辑 | 黎明 你在孩子的教育花费上投入有多少? 焦虑.跟风.鸡娃.疯狂报课,这是如今多少家长的真实写照.不用说动辄一平米十几万 ...

最新文章

  1. 【灌水】一些奇妙的图片(持续更新)
  2. 从责任界定和问题预警角度 解读全栈溯源对DevOps的价值
  3. 全能无线渗透测试工具,一个LAZY就搞定了
  4. IntelliJ IDEA下载激活
  5. 前端获取后端传来的session_java后台如何获取,前台传来的表单数据
  6. Linux shell 进制转换
  7. 三维重建:QT+OpenNI+Kinect图像校正
  8. 奇妙的安全旅行之DSA算法
  9. 演示JSP注释的使用
  10. oracle 精度异常01438,序列值超过字段精度导致ORA-01438
  11. 每日算法系列【LeetCode 907】子数组的最小值之和
  12. Two-stage rotation animation is deprecate警告
  13. 模板中的占位符替换问题
  14. 社交网络与社会计算课程内容梳理总结
  15. 使用BatteryHistorian分析和优化应用电量
  16. 51单片机矩阵键盘控制数码管
  17. 判断一个数是否是素数
  18. 塞班系统更新服务器,塞班系统还在更新?网友:我把N8从抽屉里拿了出来
  19. 实时调度论文中经常出现的术语 ties broken arbitrary的意思
  20. GDB调试器——GDB调试器简介

热门文章

  1. 正确修改SATA模式
  2. 浅谈怎样入侵服务器,仅供学习用
  3. 笔记本显示电源已连接但是未充电的简单解决办法
  4. psd转html 织梦,如何将PSD模型转化成XHTML和CSS文件
  5. 各代iphone尺寸_iPhone12系列尺寸对比-历代iPhone机型尺寸比较
  6. 结点电压法的c语言实现,节点电压法该如何理解_节点电压法例题
  7. 金士顿服务器内存条怎么看型号,区分内存条型号的方法
  8. 华为android打开usb调试模式,华为P6 USB调试在哪 如何打开USB调试【详解】
  9. 山东省枣庄高新区益洋花园地块场地环境初步调查信息公示
  10. 宁芝84静电容(蓝牙双模)键盘说明书