这题其实就是一个求数组中第K大数的问题,用快速排序的思想可以解决。结果一路超时。。原来要加输入输出优化,具体优化见代码。

顺便把求数组中第K大数和求数组中第K小数的求法给出来。

代码:

  1. /*
  2. * this code is made by whatbeg
  3. * Problem: 1099
  4. * Verdict: Accepted
  5. * Submission Date: 2014-06-15 00:13:53
  6. * Time: 4340 MS
  7. * Memory: 21212 KB
  8. */
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <algorithm>
  14. #include <cstdlib>
  15. #include <iomanip>
  16. using namespace std;
  17. #define N 1007
  18.  
  19. //复杂度O(n)
  20. int Max_K(int a[],int low,int high,int k)
  21. {
  22. if(k <= || k > high-low+)
  23. return -;
  24. int flag = low + abs(rand())%(high-low+); //随机选择一个基准点
  25. swap(a[low],a[flag]);
  26. int mid = low;
  27. int cnt = ;
  28. for(int i=low+;i<=high;i++)
  29. {
  30. if(a[i] > a[low]) //遍历,把较大的数放在数组左边
  31. {
  32. swap(a[++mid],a[i]);
  33. cnt++;
  34. }
  35. }
  36. //比基准点大的数的个数为cnt-1
  37. swap(a[mid],a[low]); //将基准点放在左、右两部分的分界处
  38. if(cnt > k)
  39. return Max_K(a,low,mid-,k);
  40. else if(cnt < k)
  41. return Max_K(a,mid+,high,k-cnt);
  42. else
  43. return mid;
  44. }
  45.  
  46. int Min_K(int a[],int low,int high,int k)
  47. {
  48. if(k <= || k > high-low+)
  49. return -;
  50. int flag = low + abs(rand())%(high-low+);
  51. swap(a[low],a[flag]);
  52. int mid = low;
  53. int cnt = ;
  54. for(int i=low+;i<=high;i++)
  55. {
  56. if(a[i] < a[low])
  57. {
  58. swap(a[++mid],a[i]);
  59. cnt++;
  60. }
  61. }
  62. swap(a[mid],a[low]);
  63. if(k < cnt)
  64. return Min_K(a,low,mid-,k);
  65. else if(k > cnt)
  66. return Min_K(a,mid+,high,k);
  67. else
  68. return mid;
  69. }
  70.  
  71. inline int in()
  72. {
  73. char ch;
  74. int a = ;
  75. while((ch = getchar()) == ' ' || ch == '\n');
  76. a += ch - '';
  77. while((ch = getchar()) != ' ' && ch != '\n')
  78. {
  79. a *= ;
  80. a += ch - '';
  81. }
  82. return a;
  83. }
  84.  
  85. inline void out(int a)
  86. {
  87. if(a >= )
  88. out(a / );
  89. putchar(a % + '');
  90. }
  91.  
  92. int a[];
  93.  
  94. int main()
  95. {
  96. int n,k;
  97. while(scanf("%d%d",&n,&k)!=EOF)
  98. {
  99. getchar();
  100. for(int i=;i<n;i++)
  101. a[i] = in();
  102. int res = Max_K(a,,n-,k);
  103. out(a[res]);
  104. puts("");
  105. }
  106. return ;
  107. }

ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化的更多相关文章

  1. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】

    瑶瑶的第K大 Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status ...

  2. [ACdream 1099] 瑶瑶的第K大

    瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Problem Des ...

  3. ACdream 1099求第k大

    题目链接 瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) Submit ...

  4. ACdream 1104 瑶瑶想找回文串(SplayTree + Hash + 二分)

    Problem Description 刚学完后缀数组求回文串的瑶瑶(tsyao)想到了另一个问题:如果能够对字符串做一些修改,怎么在每次询问时知道以某个字符为中心的最长回文串长度呢?因为瑶瑶整天只知 ...

  5. [ACdream]瑶瑶带你玩激光坦克

    题目链接:http://acdream.info/contest?cid=1269#problem-B Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来 ...

  6. ACdream 1103 瑶瑶正式成为CEO(树链剖分+费用流)

    Problem Description 瑶瑶(tsyao)是某知名货运公司(顺丰)的老板,这个公司很大,货物运输量极大,因此公司修建了许多交通设施,掌控了一个国家的交通运输. 这个国家有n座城市,公司 ...

  7. acdream 瑶瑶带你玩激光坦克 (模拟)

    瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submi ...

  8. 瑶瑶GBK好的,UTF-8卡死

    请求地址: 开发环境核心 esb : http://10.15.22.120:8866/0203000007/EmpAndDptRelateInfoSync/V1 用gbk可以马上返回. 用utf-8 ...

  9. B - 瑶瑶带你玩激光坦克

    B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) S ...

随机推荐

  1. Angularjs,WebAPI 搭建一个简易权限管理系统 —— Angularjs 前端主体结构(五)

    目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 6 Angularjs 前端主体结构 6.1 A ...

  2. Java中Scanner类和BufferReader类之间的区别

    java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...

  3. play framework学习笔记之 模板引擎

    模板语法 ${client.name} ${client?.name} 不能确定client是否存在的时候? #{extends /} #{doLayout /}#{get} #{set} 比如 #{ ...

  4. RHEL7虚拟机实验快照

    配置虚拟机连接网络 首先确保NetworkManager服务正常运行 [root@administrator ~]# systemctl status NetworkManager ● Network ...

  5. 关于ArcGIS10.0中的栅格计算中的函数

    版本升级确实很重要,在ArcGIS10.1中计算成功的,在10.0中出了问题. 问题 在进行栅格计算时,计算公式很简单,包括两个Ln函数: "-22.73 + 11.1 * Ln(5) + ...

  6. Microsoft Dynamics CRM 2013 安装过程 图解

    在安装前,先持一下SQL配置管理,将相关的服务打开.(由于在虚拟机里,许多服务需要时才会打开,像Reporting Services需要处理报表时才打开) 注:Analysis Services 登录 ...

  7. SharePoint 2013 术语和术语集介绍

    托管元数据是一个集中管理的术语的分层集合,我们可以定义术语和术语集,然后将其用作 SharePoint Server 2013 中项目的属性.简单的说,术语是一个可与 SharePoint Serve ...

  8. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q45-Q47)

    Question45You create and deploy a custom Web Part.You add the Web Part to a page and receive a run-t ...

  9. 深入理解Android的startservice和bindservice

    一.首先,让我们确认下什么是service?         service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...

  10. 关于在Xcode的OC工程中相对路径失败的原因

    Xcode的工程生成的可执行文件不是默认在源文件同一个目录下面的,所以当可执行文件执行的时候,相对路径就不对了. 这一点用终端直接编译执行文件证明了这一点: clang -fobjc-arc -fra ...