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小数的更多相关文章

  1. 第K 小数

    [问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包 ...

  2. 数组第K小数问题 及其对于 快排和堆排 的相关优化比较

    题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...

  3. Bsoj 1322 第K小数

    第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一 ...

  4. 算法打基础——顺序统计(找第k小数)

    这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...

  5. 查找第K小数

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

  6. OJ2237第k小数题解

    题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...

  7. 【递归打卡2】求两个有序数组的第K小数

    [题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...

  8. 两个有序数组的上中位数和第K小数问题

    哈,再介绍个操蛋的问题.当然,网上有很多解答,但是能让你完全看懂的不多,即便它的结果是正确的,可是解释上也是有问题的. 所以,为了以示正听,我也做了分析和demo,只要你愿意学习,你就一定能学会,并且 ...

  9. 2018.07.08 NOIP模拟 第K小数(二分)

    第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 ...

随机推荐

  1. java class 文件格式解析

    前言 大约5年前,想研究javaassistant,cglib等字节码操作的相关类库,来对class进行增强,当要到要操作字节码的时候,发现无法继续下去了,只能放弃. 学习jvm字码,需要理解clas ...

  2. python基础练习题(有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?)

    day6 --------------------------------------------------------------- 实例011:养兔子 题目 有一对兔子,从出生后第3个月起每个月 ...

  3. i2c调试工具分享

    i2c-tools简介 在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具--i2c-tools. i2c-tool ...

  4. spring-data-jpa操作数据库

    1.spring-data-jpa是spring对hibernate的整合 2.spring boot工程在实体类添加注解.添加两个依赖.写配置文件,可以自动生成数据库表 实体类: @Entity / ...

  5. [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算

    [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 目录 [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 0x1. 运行 ...

  6. 劳动节快乐!手写个核心价值观编码工具 - Python实现

    前言 今天是五一劳动节,祝各位无产阶级劳动者节日快乐! 然后来整活分享一些有趣的东西~ 这个小工具是我大学时做着玩的,对于各位接班人来说,12个词的核心价值观这东西,大家都非常熟悉了,这工具可以实现将 ...

  7. cobalt strike4.4的下载和使用

    cobalt strike4.4的下载和使用 cobalt strike4.4下载和汉化 首先下载cobaltstrike.jar yunzhongzhuan.com/#sharefile=cZ5vo ...

  8. linux下nginx软件的学习

    参考博客 1.nginx是什么 nginx是一个开源的,支持高性能,高并发的web服务和代理服务软件.它是开源的软件. nginx比它大哥apache性能改进许多,nginx占用的系统资源更少,支持更 ...

  9. Oracle19c单实例数据库配置OGG单用户数据同步测试

    目录 19c单实例配置GoldenGate 并进行用户数据同步测试 一.数据库操作 1.开启数据库附加日志 2.开启数据库归档模式 3.开启goldengate同步 4.创建goldengate管理用 ...

  10. axios源码解析 - 请求拦截器

    axios请求拦截器,也就是在请求发送之前执行自定义的函数. axios源码版本 - ^0.27.2 (源码是精简版) 平时在业务中会这样去写请求拦截器,代码如下: // 创建一个新的实例 var s ...