NC207028 第k小数
NC207028 第k小数
题目
题目描述
给你一个长度为 \(n\) 的序列,求序列中第 \(k\) 小数的多少。
输入描述
多组输入,第一行读入一个整数 \(T\) 表示有 \(T\) 组数据。
每组数据占两行,第一行为两个整数 \(n,k\) ,表示数列长度和 \(k\) 。
第二行为 \(n\) 个用空格隔开的整数。
输出描述
对于每组数据,输出它的第 \(k\) 小数是多少。
每组数据之间用空格隔开
示例1
输入
2
5 2
1 4 2 3 4
3 3
3 2 1
输出
2
3
备注
\(t \leq10 , 1\leq n\leq5\times 10^6,k\leq n\) 数列里每个数都在 \(int\) 范围内
题解
思路
知识点:排序,递归。
数据量显然使用 \(O(n\log n)\) 的排序,但是使用快排可以更加优化。
快排的原理是选定一个数值(一定是值,不是下标,因为不是按下标分界,是按值分界)作为枢轴 \(mid\) ,然后设置两个指针 \(i,j\) 同时从首尾开始遍历序列,\(i\) 找小于 \(mid\) 的元素, \(j\) 找大于 \(mid\) 的元素。每找到一组就交换它们,直到 \(i>j\),最后序列就排序为左右部分,左边比 \(mid\) 小且 \(j\) 是右端点,右边比 \(mid\) 大且 \(i\) 是左端点。
观察 \(k\) 和 \(i,j\) 的关系,若 \(k\leq j\) 则第 \(k\) 小在左边,接下来只要排左边;若 \(k\geq i\) 则第 \(k\) 小在右边,接下来只要排右边;若 \(i<k< j\) (仅在 \(i\) 和 \(j\) 同时到达值为 \(mid\) 的位置才可能出现,其他情况 \(j=i-1\) ),则目前第 \(k\) 个就是最终答案。
快读快写是题目要求 qwq。
时间复杂度 \(O(n\log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[5000007];
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c>'9') {
if (c == '-') f = -1;
c = getchar();
}///整数符号
while (c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}///挪位加数
return x * f;
}
int quick_sort(int l, int r, int k) {
if (l == r) return a[l];
int i = l, j = r;
int mid = a[l + r >> 1];
while (i <= j) {
while (a[i] < mid)i++;
while (a[j] > mid)j--;
if (i <= j) {
swap(a[i], a[j]);
i++, j--;
}
}///循环条件设成包括=,是为了循环完的i,j就是需要排序的严格端点。
if (k <= j) return quick_sort(l, j, k);///因为只有在(j,i)之间才是以及排好的,不包括端点
else if (k >= i) return quick_sort(i, r, k);
else return a[k];
}
bool solve() {
int n = read(), k = read();
for (int i = 0;i < n;i++) a[i] = read();
cout << quick_sort(0, n - 1, k - 1) << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
t = read();
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
NC207028 第k小数的更多相关文章
- 第K 小数
[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包 ...
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- Bsoj 1322 第K小数
第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一 ...
- 算法打基础——顺序统计(找第k小数)
这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...
- 查找第K小数
题目描述 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入描述: 输入有多组数据.每组输入n,然后输入n个整数(1<=n<=1000), ...
- OJ2237第k小数题解
题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...
- 【递归打卡2】求两个有序数组的第K小数
[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...
- 两个有序数组的上中位数和第K小数问题
哈,再介绍个操蛋的问题.当然,网上有很多解答,但是能让你完全看懂的不多,即便它的结果是正确的,可是解释上也是有问题的. 所以,为了以示正听,我也做了分析和demo,只要你愿意学习,你就一定能学会,并且 ...
- 2018.07.08 NOIP模拟 第K小数(二分)
第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 ...
随机推荐
- Java语言学习day25--7月31日
今日内容介绍1.final 关键字2.static 关键字3.匿名对象4.内部类5.包的声明与访问6.访问修饰符7.代码块 ###01final关键字概念 * A: 概述 继承的出现提高了代码的复用性 ...
- python基础练习题(输入三个整数x,y,z,请把这三个数由小到大输出)
day3 --------------------------------------------------------------- 实例005:三数排序 题目: 输入三个整数x,y,z,请把这三 ...
- 不care工具,在大数据平台中Hive能自动处理SQL
摘要:有没有更简单的办法,可以直接将SQL运行在大数据平台? 本文分享自华为云社区<Hive执行原理>,作者: JavaEdge . MapReduce简化了大数据编程的难度,使得大数据计 ...
- i2c调试工具分享
i2c-tools简介 在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具--i2c-tools. i2c-tool ...
- ps、top命令查找不到进程的解决方案
netstat -anpt发现一个奇怪的连接,但是ps和top命令确查不到此进程,这很可能是因为因为ps和top命令被替换了导致这些进程被过滤掉了.因此我这里有个脚本专门查找出来隐藏的进程 #!/us ...
- Redis6通信协议升级至RESP3,一口气看完13种新数据类型
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在前面的文章 Redis:我是如何与客户端进行通信的 中,我们介绍过RESP V2版本协议的规范,RESP的全程是Redis Serializa ...
- MyBatis插件 - 通用mapper
1.简单认识通用mapper 1.1.了解mapper 作用:就是为了帮助我们自动的生成sql语句 [ ps:MyBatis需要编写xxxMapper.xml,而逆向工程是根据entity实体类来进行 ...
- python学习-Day5
目录 今日学习内容详解 流程控制理论 程序执行流程分类: 重点小知识* 分支结构(if 语法) 单 if 分支 if 与 else 分支 if 与 elif 与 else 分支 if嵌套 练习 循环结 ...
- 图文详解:小白也能看懂的 Kubernetes
Kubernetes 这个单词来自于希腊语,含义是舵手或领航员 .其词根是 governor 和 cybernetic.K8s 是它的缩写,用 8 字替代了"ubernete". ...
- Linux操作系统,为什么需要内核空间和用户空间?
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 本文以 32 位系统为例介绍内核空间(kernel sp ...