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 个数,询问这 ...
随机推荐
- 共读《redis设计与实现》-数据结构篇
准备将之前攒下的书先看一遍,主要是有个大概的了解,以后用的时候也知道在哪里找.所以准备开几篇共读的帖子,激励自己多看一些书. Redis 基于 简单动态字符串(SDS).双端链表.字典.压缩列表.整数 ...
- 百度AI人脸检测——解析JSON 数据格式
1.了解一下 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据.不过这个时候就出现了一个问题,这些数据到底要以什么样的格式在网络上传输呢 ...
- ucore lab7 同步互斥机制 学习笔记
管程的设计实在是精妙,初看的时候觉得非常奇怪,这混乱的进程切换怎么能保证同一时刻只有一个进程访问管程?理清之后大为赞叹,函数中途把前一个进程唤醒后立刻把自己挂起,完美切换.后一个进程又在巧妙的时机将自 ...
- SpringJdbcTemplate简单实现
SpringJdbcTemplate 配置文件 1.依赖坐标 <dependencies> <dependency> <groupId>javax.servlet& ...
- kernel UAF && tty_struct
kernel UAF && 劫持tty_struct ciscn2017_babydriver exp1 fork进程时会申请堆来存放cred.cred结构大小为0xA8.修改cred ...
- MySQL 高频面试题,都在这了
点击上方"开源Linux",选择"设为星标"回复"学习"获取独家整理的学习资料! 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务 ...
- 浅谈 UNIX、Linux、ios、android 他们之间的关系
开源Linux 一个执着于技术的公众号 Unix, 简化形成了Linux,Linux则是Android的内核,而苹果则是使用unix系统作为ios和macos的内核. 几个系统出现的时间 UNIX系统 ...
- 记一次百万行WPF项目代码的重构记录
此前带领小组成员主导过一个百万行代码上位机项目的重构工作,分析项目中存在的问题做了些针对性的优化,整个重构工作持续了一年半之久. 主要针对以下问题: 1.产品型号太多导致代码工程的分支太多,维护时会产 ...
- [源码解析] TensorFlow 分布式之 ParameterServerStrategy V2
[源码解析] TensorFlow 分布式之 ParameterServerStrategy V2 目录 [源码解析] TensorFlow 分布式之 ParameterServerStrategy ...
- layui数据表格导入数据
作为一个后端程序员,前端做的确实很丑,所以就学习了一下layui框架的使用.数据表格主要的问题就是传输数据的问题,这里我用我的前后端代码来做一个实际的分解. 前端部分 可以到layui官网示例中找到数 ...