hiho一下 37 (无序二分·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("%d%d", &n, &k))
    {
        for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
        if(n < k) {puts("-1"); continue;}
        l = 0, r = n - 1;
        while(l <= r)
        {
            m = a[le = l], ri = r;
            while(le < ri)
            {
                while(le < ri && a[ri] > m) --ri;
                a[le] = a[ri];
                while(le < ri && a[le] < m) ++le;
                a[ri] = a[le];
            }
            a[le] = m;
            if(le < k - 1) l = le + 1;
            else r = le - 1;
        }
        printf("%d\n", a[r + 1]);
    }
    return 0;
}

二分·二分查找之k小数

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

在上一回里我们知道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
时间: 2024-10-13 10:48:30

hiho一下 37 (无序二分·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现在把所有

第k小数1

对于给定的n个元素的无序数组,要求从中找出第k小的元素 二分法+快速排序 例如一列由10个元素组成的数组:[5, 7, 1, 2, 3, 9, 8, 10,  4, 6],假设找出k = 4 的元素. 将第一个元素5作为参照物, 将比5小的数放在5的左边,比5大的数放在5的右边,则数组第一次调整为[2,1,4,3]5[10,9,8,7]. 比5小的数由4个,所以将搜索范围缩小到5的左边数组即[2,1,4,3]舍弃右边的数组. 以2为参照物, 将比2小的数字放在2的左边,比2大的数字放在2的右边.

hdu5884 Sort(二分+k叉哈夫曼树)

题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给定的情况下,构造k叉哈夫曼树.O(nlogn)的做法:先对所有数排序,另外一个队列维护合并后的值,取值时从两个序列前端取小的即可. 注:如果(n-1)%(k-1)!=0,那么就要增加(k-1-(n-1)%(k-1))个权值为0的叶子节点作虚拟点. 1 #include<cstdio> 2 #inc

Bsoj 1322 第K小数

第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一行,两个整数N,M,表示最开始有N个整数,总共有M个操作 第二行用空格隔开的N个整数 接下来M行,每行表示一个操作 Output 若干行,一行一个整数,表示所求的第K小的数字 Sample Input 5 5 6 2 7 4 9 1 8 1 6 3 10 2 4 3 3 Sample Output

第K 小数

[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包含三行.第一行为三个正整数N,M和K.第二行为N个正整数,表示第一个数列.第三行为M个正整数,表述第二个数列.[输出格式]输出文件名为number.out.输出文件包含一行,一个正整数表示第K小数.[输入输出样例1 1 ]number.in 2 3 41 22 1 3 number.out3[输入输

HDU 2852 KiKi&#39;s K-Number(动态过程求第K小数)

题意: 给出三种操作, 0 在容器中插入一个数. 1 在容器中删除一个数. 2 求出容器中大于a的第k大元素. 思路:可以用树状数组和线段树,显然a[1]+...+a[i]随i有明显的单调性,所以可以二分出答案 线段树时间复杂度比树状数组的常数大了几倍...所以线段树擦边过了 还有另外一种思路:二分只是二分出a[1]+...+a[i]的上界i,所以可以逆向考虑,从a[1]开始累加,直到到达k,这样的复杂度就由原来的 O(lgN*lgN) 变成O(lgN)了.难在累加的过程,线段树和树状数组是同样

HDU 2852 (树状数组+无序第K小)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小数. 解题思路: 由于模型是盒子,而不是序列,所以可以用树状数组的顺序维护+逆序数思想. 对应的树状数组Solution: 放一个数 $Add(val,1)$ 类似维护逆序数的方法,对应位置上计数+1. 删一个数 判断:$getSum(val)-getSum(val-1)=0$ 可以Hash处理,但

【OJ2130】K小数查询

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