Luogu P1878

事实上这道题并不难,但我真没弄懂我手写堆为什么过不了。所以

STL大法好!!!

基本思路

对于每一对相邻异性,将他们的舞蹈技术的差插入一个堆
通过维护这个小根堆,每次就可以取得舞蹈技术差最小的一对
值得注意的是,每次取完一对舞伴之后,要对这对舞伴进行标记,并将堆中所有有这两位舞者参与的舞伴弹出这个堆。并且还需要找到这一对舞伴两边的第一个未被挑出的人,如果是异性则可以作为新的舞伴加入堆

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<queue>
  5. using namespace std;
  6. struct data
  7. {
  8. int l,r,val;
  9. bool operator <(const data&x) const
  10. {
  11. if (x.val!=val) return x.val<val;
  12. else return x.l<l;
  13. }//重载运算符
  14. };
  15. int len,n,que[200005],a[200005],ans,group1[200005],group2[200005],rlen;
  16. bool choice[200005];
  17. priority_queue <data> heap;
  18. int main()
  19. {
  20. scanf("%d\n",&n);
  21. for (int i=1;i<=n;i++)
  22. {
  23. char c;
  24. scanf("%c",&c);
  25. if (c=='B') que[i]=true;//对男生进行标记
  26. }
  27. scanf("%d",&a[1]);
  28. for (int i=2;i<=n;i++)
  29. {
  30. scanf("%d",&a[i]);
  31. if (que[i]!=que[i-1]) //可以组成舞伴则进堆
  32. {
  33. data rec;
  34. rec.l=i-1;rec.r=i;
  35. rec.val=abs(a[i]-a[i-1]);
  36. heap.push(rec);
  37. }
  38. }
  39. while (!heap.empty())
  40. {
  41. data rec=heap.top();
  42. ans++;
  43. group1[ans]=rec.l;
  44. group2[ans]=rec.r;
  45. choice[rec.l]=choice[rec.r]=true;//打上标记
  46. while (choice[rec.l]||choice[rec.r])
  47. {
  48. if (heap.empty()) break;
  49. heap.pop();
  50. rec=heap.top();
  51. }//这一个循环的目的就是使堆顶元素是没有被选过的
  52. int l=group1[ans];int r=group2[ans];
  53. while (l>0&&choice[l]) l--;
  54. while (r<=n&&choice[r]) r++;
  55. //寻找两边未被选的人
  56. if (que[l]!=que[r]&&l>0&&r<=n)
  57. {
  58. rec.l=l;
  59. rec.r=r;
  60. rec.val=abs(a[l]-a[r]);
  61. heap.push(rec);
  62. }
  63. }
  64. printf("%d\n",ans);
  65. for (int i=1;i<=ans;i++) printf("%d %d\n",group1[i],group2[i]);
  66. return 0;
  67. }

【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 中文乱码matplotlib乱码 (Windows)

    Python解决matplotlib中文乱码问题(Windows) matplotlib是Python著名的绘图库,默认并不支持中文显示,因此在不经过修改的情况下,无法正确显示中文.本文将介绍如何解决 ...

  2. OptimalSolution(3)--链表问题(1)简单

    单链表Node节点类 public class Node { public int val; public Node next; public Node(int val) { this.val = v ...

  3. unity 基于scrollRect实现翻页显示

    unity 基于scrollRect实现翻页显示,并定为到某一页,而不是某一页的中间方法(第二个脚本采用实际位置计算,并在update里实现平滑过渡): 组场景时,经常需要获取鼠标(或者点击)开始结束 ...

  4. Unity C#数据持久化与xml

    最近工作需要用到数据持久化,所以在此分享一下,通过查阅资料,数据持久化大体都是通过xml或者json来进行的.unity为我们自定义了数据持久化方法,但是比较局限,还需要自己来完成数据持久化方法. ( ...

  5. Mongo 导出为csv文件

    遇到需要从Mongo库导出到csv的情况,特此记录. 先贴上在mongo目录下命令行的语句: ./mongoexport -h 10.175.54.77 -u userName -p password ...

  6. 【JAVA】可视化计算器

    import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.Actio ...

  7. MIT线性代数:17.正交矩阵和Cram-Schmidt正交化

  8. continue和break在while中用法

    continue用法:结束本次循环,不执行continue下面的语句,返回执行下一次循环.注意:当执行完while的循环后,执行else 后的语句 break:结束循环,else下面语句也不执行

  9. Vue项目中执行npm run dev 不报错也不显示点击的地址链接

    问题描述: 输入npm run dev 没有报错也没有显示可以点击的地址链接,如下图: 解决方法: 具体配置: autoOpenBrowser默认为false,改为true.重新 npm run de ...

  10. 1、第一个TensorFlow程序

    import tensorflow as tf import os os.environ[' #去掉警告,将警告级别提升 a = tf.constant(2) #定义一个常量 b = tf.const ...