描述


在上一回里我们知道Nettle在玩《艦これ》,Nettle的镇守府有很多船位,但船位再多也是有限的。Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了。所以Nettle不得不把其中一艘船拆掉来让位给新的船。Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船。 已知每一艘船都有自己的稀有度,Nettle现在把所有船的稀有度值告诉你,希望你能帮他找出目标船。
提示:非有序数组的二分查找之二

输入


第1行:2个整数N,k。N表示数组长度,
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。

输出


第1行:一个整数t,表示t在数组中是第k小的数,若K不在数组中,输出-1。

样例输入

10 4
1732 4176 2602 6176 1303 6207 3125 1 1011 6600

样例输出

1732

题解


利用类似快速排序的方法将问题区间不停二分,期望情况是($n +\frac n 2 +\frac n 4 +\frac n 8 + \dots+1 $)即\(2n\),随机化基准数即可。

每一次我们随机从数组中选取一个数m,将比m小的数从a[1]开始放置,将比m大的数从a[N]开始放置。当其他所有的数都放置完成后。最后剩下的格子放置m,不妨设为a[Mid], 则在我们进行一次遍历交换以后有如下性质:
若k<Mid,则有第k小的数一定在a[L..Mid-1]之中,令R = Mid - 1
若k=Mid,则m就是我们要找的数
若k>Mid,则第k小的数一定在a[Mid+1..R]之中,令L = Mid + 1。此处需特别注意,在a[Mid+1..R]我们查找的k'和原来的k不相同,现在的k'=k-Mid。

#include <vector>
#include <queue>
#include <cstdio>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define inf 1000000000
#define PI acos(-1)
#define bug puts("here")
#define REP(i,x,n) for(int i=x;i<=n;i++)
#define DEP(i,n,x) for(int i=n;i>=x;i--)
#define mem(a,x) memset(a,x,sizeof(a))
typedef unsigned long long ull;
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
inline void Out(int a){if(a<0) putchar('-'),a=-a;if(a>=10) Out(a/10);putchar(a%10+'0');
}
const int N=1e6+5;
int a[N];
int main(){int n=read(),m=read();REP(i,1,n) a[i]=read();int l=1,r=n,ans=-1;while(l<=r){int w=rand()%(r-l+1)+l;swap(a[l],a[w]);int tmp=a[l],tl=l,tr=r;while(tl<tr){while(tl<tr&&a[tr]>=tmp) tr--;a[tl]=a[tr];while(tl<tr&&a[tl]<=tmp) tl++;a[tr]=a[tl];}a[tl]=tmp;if(tl==m) {ans=a[tl];break;}else if(tl>m) r=tl-1;else l=tl+1;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/zsyacm666666/p/7627051.html

【HIHOCODER 1133】 二分·二分查找之k小数相关推荐

  1. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

    问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...

  2. 【九度OJ】查找第K小数

    题目 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000),再输入k. ...

  3. 题目1174:查找第K小数

    题目描述: 查找一个数组的第K小的数,注意同样大小算一样大. 如  2 1 3 4 5 2 第三小数为3. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000), ...

  4. 【慢慢学算法】:查找第k小数

    题目描述: 查找一个数组的第K小的数,注意同样大小算一样大.  如  2 1 3 4 5 2 第三小数为3. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000) ...

  5. Java1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程,直接查

    1.使用二分搜索算法查找任意N个有序数列中的指定元素. 2.通过上机实验进行算法实现. 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告. 4.至少使用两种方法进行编程,直接查找/递归 ...

  6. Java冒泡,快速,插入,选择排序^_^+二分算法查找

    这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get {public static voi ...

  7. 秒速五厘米(快速二分跳跃查找答案)

    秒速五厘米(快速二分跳跃查找答案) **秒速五厘米(快速二分跳跃查找答案) 让我们来看这道题(题目来源:吉首大学) #问题 D: 秒速五厘米 描述 樱花飘落的速度,每秒五厘米. 动漫<秒速五厘米 ...

  8. jzoj4438 K小数查询

    Data Constraint n<=80000,所有数字的绝对值不超过5000000 Solution 这是一道分块的板题 但是并不是那么好写的 一般来说我们都按照根号n为块的大小进行分块 那 ...

  9. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

最新文章

  1. python经典案例-Python递归的经典案例
  2. 【Java线程】线程同步—synchronized Lock
  3. 07.suggester简述
  4. VC启动窗口画面制作方法研究
  5. 自定义View的学习(一)
  6. erlang一次线上问题解决
  7. 自带数据线的迷你数显充电宝,春运相亲必备呀
  8. android中json解析及使用(中)
  9. PostgreSQL/pgsql数据库优化查询和索引的猜想
  10. 计算机上直接拆硬盘在硬盘盒中使用,触目惊心 西数1TB移动硬盘拆解_硬盘/光驱盒_移动存储-中关村在线...
  11. python共享单车数据分析_共享单车数据可视化分析(Python/Seaborn)
  12. MATLAB之模型仿真(一)简单自由落体运动
  13. CanOpen协议的伺服驱动控制
  14. 小心身份证复印件的使用
  15. 新CSDN文章转成PDF、打印(去空白)
  16. 计算机硬件软件的英语,计算机软件和硬件,PC computer software and hardware,音标,读音,翻译,英文例句,英语词典...
  17. 软件发明专利实例_软件发明专利思路(精)
  18. 写一个自动回复的聊天机器人
  19. android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
  20. ae教程 (三)三维空间合成(二)

热门文章

  1. CIF进口货物流程图_FOB、CIF和CFR,你真的了解吗?
  2. ios 倒数器_如何使用倒数计时器来停止游戏 – iOS [SWIFT] –
  3. php后端接收数据,后端如何接收fetch方式发送的数据?
  4. python表单验证_python表单验证封装
  5. mysql 执行计划不对_MySQL执行计划显示与执行过程不符合
  6. recv java_Java与Python的recv()网络函数的等价性
  7. java中三种方法_Java文件I/O的三种方法
  8. 用asp.net实现微博系统_微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?...
  9. 福一中招聘计算机教师,2017福建福州一中招聘拟聘公示
  10. 20200922:leetcode35周双周赛题解记录(下)