http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1352

题意:就是要将7 1 5 2这样的序列变成1  2  5  7最少需要多少步?给出变的规律,每次把最前面的那个数移动到比它次小的数的后面,要是它后面没有比它次小的数,就移动到最后,问最少需要多少步?

For example, we will use 7 steps to sort the sequence 7 1 5 2:
    7 1 5 2 --> 1 5 7 2 --> 5 7 2 1 --> 7 2 5 1 --> 2 5 7 1 --> 5 7 1 2 --> 7 1 2 5 --> 1 2 5 7

思路:这个题目给出的数据量很大,所以一步步模拟肯定超时。那么就只能是看各种数字移动到它最终位置是否存在一定规律......经过思考,发现好像没有什么规律....于是这道题目我就放弃了.....然后我的一个队友说,一个数移动到它次小的数后面,那么就可以把这两个数合并成一个数,然后再找再合并.....这样时间复杂度会减少很多。的确是这样的,合并完之后,我们只需要用个并查集来统计有多少个数合并在一起了,然后每次移动的时候,把这些数加上即可.......只是,这样还有一个问题,如何找到比它次小的数?如果次小的数已经被合并了呢?......暴力去查找,明显耗时会很大,可能会超时,那么可以把数据进行离散化,由于所以数字都是独一无二的,那么在找次小的数的时候,我们只需要find(x-1)即可........

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. #define inf 100005
  8. typedef long long ss;
  9. ss father[inf],rank[inf];
  10. ss a[inf],b[inf],n;
  11. queue<ss>q;
  12. queue<ss>q1;
  13. ss erfen(ss sum)
  14. {
  15. ss ll=0,rr=n-1;
  16. while(ll<=rr)
  17. {
  18. ss mid=(ll+rr)/2;
  19. if(b[mid]>sum)
  20. rr=mid-1;
  21. else ll=mid+1;
  22. }
  23. return rr;
  24. }
  25. ss find(ss x)
  26. {
  27. ss i=x,root;
  28. while(x!=father[x])
  29. x=father[x];
  30. root=x;
  31. x=i;
  32. while(x!=father[x])
  33. {
  34. i=father[x];
  35. father[x]=root;
  36. rank[root]+=rank[x];
  37. rank[x]=0;
  38. x=i;
  39. }
  40. return root;
  41. }
  42.  
  43. void liantong(ss x,ss y)
  44. {
  45. father[x]=y;
  46. rank[y]+=rank[x];
  47. rank[x]=0;
  48. }
  49. int main()
  50. {
  51. ss text;
  52. scanf("%lld",&text);
  53. while(text--)
  54. {
  55. scanf("%lld",&n);
  56. while(!q.empty())
  57. q.pop();
  58.  
  59. while(!q1.empty())
  60. q1.pop();
  61. for(ss i=0;i<n;i++)
  62. {
  63. scanf("%lld",&a[i]);
  64. b[i]=a[i];
  65. father[i]=i;
  66. rank[i]=1;
  67. }
  68. sort(b,b+n);
  69. //int ll=1,rr=n-1;
  70. for(ss i=0;i<n;i++)
  71. {
  72. a[i]=erfen(a[i]);
  73. }
  74.  
  75. for(ss i=0;i<n;i++)
  76. {
  77. q.push(a[i]);
  78. }
  79. ss ans=0;
  80. while(!q.empty())
  81. {
  82. ss x=q.front();
  83. q.pop();
  84. if(!q.empty())
  85. {
  86. if(x==0)
  87. {
  88. ss flg=0;
  89. ss tmp=x;
  90. while(!q.empty())
  91. {
  92. ss y=q.front();
  93. if(tmp<y)
  94. tmp=y;
  95. else flg=1;
  96. q.pop();
  97. q1.push(y);
  98. }
  99. if(flg==1)
  100. {
  101. while(!q1.empty())
  102. {
  103. ss y=q1.front();
  104. q1.pop();
  105. q.push(y);
  106. }
  107. q.push(x);
  108. ans+=rank[x];
  109. }
  110. else break;
  111. }
  112. else
  113. {
  114. ans+=rank[x];
  115. ss y=find(x-1);
  116. if(x!=y)
  117. {
  118. liantong(x,y);
  119. }
  120. }
  121. }
  122. }
  123. printf("%lld\n",ans);
  124. }
  125. return 0;
  126. }

中南大学oj:1352: New Sorting Algorithm的更多相关文章

  1. csuoj 1352: New Sorting Algorithm

    因为每个元素都是移动到比它小1位的元素的后面: 这样的话以后的一定就可以把他们两个打包: 所以用这种方法最多扫一遍就可以了: 但是最小的那个数要不要移动呢? 如果最小的数后面的数都是升序的,那么一直扫 ...

  2. 中南大学第一届长沙地区程序设计邀请赛 New Sorting Algorithm

    1352: New Sorting Algorithm Time Limit: 1 Sec  Memory Limit: 128 MB Description We are trying to use ...

  3. 1306. Sorting Algorithm 2016 12 30

    1306. Sorting Algorithm Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description One of the f ...

  4. Bubble sort of sorting algorithm

    Bubble sort,It's a relatively basic algorithm.The core implementation ideas are as follows: 1.Define ...

  5. 排序算法 (sorting algorithm)之 冒泡排序(bubble sort)

    http://www.algolist.net/Algorithms/ https://docs.oracle.com/javase/tutorial/collections/algorithms/ ...

  6. 九度OJ 1352 和为S的两个数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1352 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和 ...

  7. Sorting Algorithm

    sorting 应该是最容易被考到的东西,自己老是学了背,背了忘.为了方便复习,这里进行总结 1. Bubble Sort 定义:每两个两个比较,每扫完一次,当前扫过的最大值放在了末尾. for i ...

  8. 排序算法(sorting algorithm) 之 选择排序(selection sort)

    https://en.wikipedia.org/wiki/Selection_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 4,6,1,3,7 -> ,3,7 1 ...

  9. 排序算法(sorting algorithm)之 插入排序(insertion sort)

    https://en.wikipedia.org/wiki/Insertion_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 loop2: 4,6,1,3,7 -> ...

随机推荐

  1. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  2. 【Java】详解菜单组件

    在这篇文章中,笔者会介绍Java图形界面编程中菜单组件的用法.关于菜单组件,因为java存在AWT编程和Swing编程,所以菜单组件也存在AWT菜单和Swing菜单.因为Swing组件使用的比较多,所 ...

  3. 【Struts2】如何查看Struts2框架的源码

    学习三大框架时难免遇到不太理解的地方需要去研究框架源码,这里总结一下查看struts2源码的两种方式. 1.直接解压struts2.X.X-all.zip,在的到的解压文件中看到如下目录: 打开图中蓝 ...

  4. 【Servlet】深入浅出JavaServlet重定向和请求转发

    import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax. ...

  5. background-size ie8不支持怎么解决

    background-size这个属性是css3,新增的属性,现在很多浏览器已经支持了,但是IE系列的浏览器却没有支持,比如IE8,下面介绍下如何解决这个问题 在IE浏览器中,可以通过滤镜filter ...

  6. 从语句 char* p="test" 说起

    我相信,使用C/C++多年的人对下面这个字符串赋值语句都不会陌生吧.                 char* p = "test";   同时,我也相信,各位在使用这种语句后吃 ...

  7. ekho安装及测试(中文文字转语音)

    1. 官网下载源码包 地址:http://www.eguidedog.net/ekho.php 2. 安装 xz -d ekho-7.5.tar.xz tar -xvf ekho-7.5.tar ap ...

  8. 【转载,待整理】初学 springmvc整合shiro

    1. shiro认证流程理解 2. 整合过程 http://blog.csdn.net/dawangxiong123/article/details/53020424 http://blog.csdn ...

  9. uefi+GPT分区安装ubuntu[zz]

    现状:1.预装win8的笔记本几乎都是uefi启动模式,配合GPT磁盘分区,于是遇到了“麻烦”不会装了,或者说按照老教程安装,结果失败了.而且有很多人在问怎么解决,其实网上就有嘛,关键词就是“uefi ...

  10. 深入理解LInux内核-进程通信

    进程间通信的基本机制:1.管道和FIFO(命名管道):最适合在进程之间实现生产者/消费者的交互.进程A向管道写入数据,进程B从管道读出数据.2.信号量:内核信号量的用户态版本.3.消息:允许进程在预定 ...