hihocoder1133 二分·二分查找之k小数

思路:

类似于快排的分治算法。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6
 7 const int MAXN = 1000000;
 8 int a[MAXN + 5], n, k;
 9
10 int partition(int * num, int l, int r)
11 {
12     int i = l, j = r, m = (l + r) >> 1;
13     int x = num[m];
14     while (i != j)
15     {
16         while (j > m && num[j] >= x)
17         {
18             j--;
19         }
20         num[m] = num[j], m = j;
21         while (i < m && num[i] <= x)
22         {
23             i++;
24         }
25         num[m] = num[i], m = i;
26     }
27     num[i] = x;
28     return i;
29 }
30
31 int findK(int * num, int l, int r, int k)
32 {
33     int pos = partition(num, l, r);
34     if (pos == k)
35     {
36         return num[k];
37     }
38     if (pos > k)
39     {
40         return findK(num, l, pos - 1, k);
41     }
42     return findK(num, pos + 1, r, k);
43 }
44
45 int main()
46 {
47     scanf("%d %d", &n, &k);
48     for (int i = 1; i <= n; i++)
49     {
50         scanf("%d", &a[i]);
51     }
52     printf("%d\n", findK(a, 1, n, k));
53     return 0;
54 }
时间: 2024-08-24 11:24:17

hihocoder1133 二分·二分查找之k小数的相关文章

hiho week 37 P1 : 二分&#183;二分查找之k小数

P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的 船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久, 决定随机选择一个k,然后拆掉稀有度第k小的船. 已知

hiho#1133 : 二分&#183;二分查找之k小数

#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船. 已知每一艘船都有自己的稀有度,Nettle现在把所有

九度OJ 1174 查找第K小数 (STL)

题目1174:查找第K小数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5161 解决:2081 题目描述: 查找一个数组的第K小的数,注意同样大小算一样大. 如  2 1 3 4 5 2 第三小数为3. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000),再输入k. 输出: 输出第k小的整数. 样例输入: 6 2 1 3 5 2 2 3 样例输出: 3 根据题意,因为相同大小,算一样大,所以,排序后得去重. #include<iostream&

hihoCoder#1133 二分&#183;二分查找之k小数

原题地址 经典问题了,O(n)时间内找第k大的数 代码: 1 #include <iostream> 2 3 using namespace std; 4 5 int N, K; 6 int *a; 7 8 int search(int left, int right, int k) { 9 if (left > right) 10 return -1; 11 int l = left; 12 int r = right; 13 int p = a[left]; 14 while (l

二分——无序数组快速查找第K小的数

#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船. 已知每一艘船都有自己的稀有度,Nettle现在把所有

hiho一下 37 (无序二分&#183;k小数)

题意  中文 可以先排序然后输出第k个  复杂度为O(N*logN)  但有更快的方法  其实二分时只要能保证mid左边的数都比mid小  mid右边的数都比mid大就能进行划分了   对于k不在的区间就不用管了  于是可以用到快排的思想 #include <cstdio> using namespace std; const int N = 1000005; int a[N]; int main() { int n, k, l, r, le, ri, m; while(~scanf(&quo

#1128 : 二分&#183;二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )

#1128 : 二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位).去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船.每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高. Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的.如果是重复的,那么这艘船在Nettle所

【OJ2130】K小数查询

2130 -- K小数查询(Solution) 题目大意 : 给你一个长度为 \(N\) 的数列和 \(Q\) 个操作,操作包括:①区间加一个数:②询问区间内第 \(k\) 小的数.\((n,q\le80000)\) . Tag: 二分.分块 Analysis By LC: 我知道这题可以用主席树做,但像我这么菜的咸鱼选手怎么可能会主席树.所以我们用分块. 第一个操作时分块常规操作,但第二个看起来不是很好做.我们可以尝试用二分答案转化问题求解,:一个数有至少 \(k-1\) 个数比它小,该数最小

AcWing 255. 第K小数 (主席树写法)

区间k小数是主席树的模板题目,如果区间不包含,用莫队+权值线段树也能解 主席树是可持久化线段树,所为可持久化,就是每次只新增不一样的节点,而保留前面的版本,这样可以做到查询. 如果询问时1-r,那么直接主席树,询问的是l-r,就用到前缀和思想,具体看代码注释 #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #inclu