查找第k大

Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 316     Solved: 20    


Description

小W有很强的好胜心,也有很明确的目标,总是希望当第k名,但是小W太菜了,经常达不到目标,于是他每次考试后都想知道第k名的分数是多少,然后以它为目标。 现在给出了每个人的分数,请求编程能力很强的你帮他迅速找到第k名的分数为多少,这样他才有更多的时间去学习。

Input

第一行为一个正整数t代表有t组数据。每组数据第一行为两个正整数n和k,第二行为n个正整数。 1 < =k < =n < =107

Output

对于每组数据,输出第k大的数

Sample Input

1
6 2
1 2 3 4 5 6

Sample Output

5

Hint

#include<cstdio>
#include<algorithm>
namespace fastIO
{
#define BUF_SIZE 100000
bool IOerror = 0;
inline char nc()
{
static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
if ( p1 == pend )
{
p1 = buf;
pend = buf + fread( buf, 1, BUF_SIZE, stdin );
if ( pend == p1 )
{
IOerror = 1;
return(-1);
}
} return(*p1++); }
inline bool blank( char ch )
{
return(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t');
}
inline void rd( int &x )
{
char ch;
while ( blank( ch = nc() ) )
;
if ( IOerror )
return;
for ( x = ch - '0'; (ch = nc() ) >= '0' && ch <= '9'; x = x * 10 + ch - '0' )
;
}
#undef BUF_SIZE
};
using namespace fastIO;
using namespace std;
const int N = 1e7+10;
int arrNum[N];
int Partition(int *arrNum, int l, int r)
{
if(arrNum == NULL || l > r)
{
return -1;
}
int mid = (l+r)>>1;
swap(arrNum[mid], arrNum[r]);
int leftSeqIndex = l; for(int i = l; i < r; i++)
{
if(arrNum[i] < arrNum[r])
{
if(i > leftSeqIndex)
{
swap(arrNum[i], arrNum[leftSeqIndex]);
}
++leftSeqIndex;
}
} swap(arrNum[leftSeqIndex], arrNum[r]);
return leftSeqIndex;
} int GetNumber(int *arrNum, int n, int k)
{
if(arrNum == NULL || n <= 0 || k <= 0 || k > n)
{
return -1;
} k = n-k+1;
int l = 0;
int r = n-1;
while(l <= r)
{
int index = Partition(arrNum, l, r);
if(index+1 == k)
{
return arrNum[index];
}
else if(index+1 < k)
{
l = index+1;
}
else
{
r = index-1;
}
}
} int main()
{
int t,n,k;
rd(t);
while(t--)
{
rd(n);
rd(k);
for(int i=0;i<n;++i)
{
rd(arrNum[i]);
}
int value = GetNumber(arrNum, n, k);
printf("%d\n",value);
}
return 0;
} /**********************************************************************
Problem: 2078
User: song_hai_lei
Language: C++
Result: AC
Time:924 ms
Memory:40280 kb
**********************************************************************/

CSUOJ2078-查找第k大(读入挂)的更多相关文章

  1. 基于快速排序思想partition查找第K大的数或者第K小的数。

    快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...

  2. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...

  3. POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)

    传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Acce ...

  4. 2018.4.24 快排查找第K大

    import java.util.Arrays; /* 核心思想:利用快排思想,先假定从大到小排序,找枢纽,枢纽会把大小分开它的两边,当枢纽下标等于k时, 即分了k位在它左边或右边,也就是最大或最小的 ...

  5. 查找第K大的值

    这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ ...

  6. POJ_3685_Matrix_(二分,查找第k大的值)

    描述 http://poj.org/problem?id=3685 一个n*n的矩阵,(i,j)的值为i*i+100000*i+j*j-100000*j+i*j,求第m小的值. Matrix Time ...

  7. POJ_3579_Median_(二分,查找第k大的值)

    描述 http://poj.org/problem?id=3579 给你一串数,共C(n,2)个差值(绝对值),求差值从大到小排序的中值,偶数向下取. Median Time Limit: 1000M ...

  8. POJ 3579 3685(二分-查找第k大的值)

    POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的 ...

  9. 查找第K大的数

    类快排 第一种方法 o(n) #include <bits/stdc++.h> using namespace std; const int N = 1000; int s[N]; int ...

随机推荐

  1. node真的是单线程模式吗

    提到node,我们就可以立刻想到单线程.异步IO.事件驱动等字眼.首先要明确的是node真的是单线程的吗,如果是单线程的,那么异步IO,以及定时事件(setTimeout.setInterval等)又 ...

  2. Java基础:数组的声明,循环,赋值,拷贝。

    数组的声明 一般有两种形式的声明: int[] a; int a[]; 这两种声明都没错,但是大多数都使用第一种声明,因为变量名是独立的,不带任何符号. 声明一个数组,并没有将a真正的初始化为一个数组 ...

  3. Django 项目笔记

    Django 环境的搭建 Django 安装 pip install django==2.1.4 Django 创建项目 django-admin startproject mysite Django ...

  4. hdu 1530 Maximum Clique (最大包)

    Maximum CliqueTime Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. 领扣(LeetCode)N叉树的层序遍历 个人题解

    给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...

  6. opencv 1 HighGUI图形用户界面初步

    1图像载入 显示和输出到文件 Opencv的命名空间 Mat类 图像的载入:imread()函数 图片的显示:imshow()函数 创建窗口:namedWindow()函数 输出图像到文件:imwri ...

  7. Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)并替换实体图标

    背景: 去年以前可以按照目录WebResourceUtility批量上传web资源,昨天发现用不了了,拿到WebResourceUtility源码改了一下都不是很方便,感觉官方写的太冗余,太长了,跟我 ...

  8. 概率的基本概念&离散型随机变量

    使用excel可以直接计算二项分布和超几何分布:

  9. FPGA基础(verilog语言)——语法篇

    verilog语言简介 verilog语言是一种语法类似于c的语言,但是与c语言也有不同之处,比如: 1.verilog语言是并行的,每个always块都是同时执行,而c语言是顺序执行的 2.veri ...

  10. (四十四)golang--协程(goroutine)和管道(channel)相结合实例

    统计1-8000之间的素数. 整体框架: 说明:有五个协程,三个管道.其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到pri ...