CSUOJ2078-查找第k大(读入挂)
2018-07-07 22:46
316 查看
查找第k大
Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 316 Solved: 20Description
小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 ; 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 **********************************************************************/
相关文章推荐
- 理解二分查找!!! 九度OJ-1534,数组中第K小的数字。
- 九度OJ 1174:查找第K小数 (排序、查找)
- 九度OJ 1174:查找第K小数 (排序、查找)
- 九度OJ 1174 查找第K小数 (STL)
- 【九度OJ】题目1174:查找第K小数 解题报告
- 九度oj 题目1174:查找第K小数(sort的使用)
- 18周OJ二分法查找元素并输出其位置
- csuoj 2015.3.15
- 算法题练习(二)------哈夫曼树,比较奇数与偶数个数,查找一个数组的第K小的数
- 【华为 OJ】字串的连接最长路径查找
- 主席树静态查找区间第k小模板(并没有杰少详细)即讲解
- 九度OJ 1111:单词替换 (查找)
- 华为OJ——查找组成一个偶数最接近的两个素数
- Random Integers+csuoj+dp
- 230. Kth Smallest Element in a BST | 二叉排序树中查找第K小的数
- 查找第K大的数据
- 杨氏矩阵:查找x是否在矩阵中,第K大数
- 查找数组第k大的元素
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- CsuOJ 1092(大尾巴狼的朋友)——因为小细节一直在WA...