总时间限制:
-
10000ms
内存限制:
-
3000kB
描述
-
小张需要从一批数量庞大的正整数中挑选出第k小的数,因为数据量太庞大,挑选起来很费劲,希望你能编程帮他进行挑选。
输入
-
第一行第一个是数据的个数n(10<=n<=10
6),第二个是需要挑选出的数据的序号k(1<=k<=10
5),n和k以空格分隔;
第二行以后是n个数据T(1<=T<=10
9),数据之间以空格或者换行符分隔。
输出
-
第k小数(如果有相同大小的也进行排序,例如对1,2,3,8,8,第4小的为8,第5小的也为8)。
样例输入
-
10 5
1 3 8 20 2
9 10 12 8 9
样例输出
-
8
小张需要从一批数量庞大的正整数中挑选出第k小的数,因为数据量太庞大,挑选起来很费劲,希望你能编程帮他进行挑选。
第二行以后是n个数据T(1<=T<=10 9),数据之间以空格或者换行符分隔。
10 5 1 3 8 20 2 9 10 12 8 9
8
这题灰常简单,注意以下几点:
1. 这道题内存的限制是3000KB,而数据的个数可能达到1000000,因为它们都是int类型,所以如果一次读入这些数据到内存中,则肯定会导致Memory Limit Exceeded错误。
2. 好在这道题,K的数目小于100000;所以,我们完全可以一次只读入100000个整型数据,然后对它使用标准库的sort算法排序,再删除比K大的数据,然后再读入下100000个整数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n, k, input, n1, n2;
vector<int> vec;
cin >> n >> k;
--k;
n1 = n;
n2 = n;
for (int i = 0; i <= n/100000; ++i){
n2 = n1 > 100000 ? 100000 : n1;
for (int j = 0; j < n2; ++j){
cin >> input;
vec.push_back(input);
}
sort(vec.begin(), vec.end());
vec.erase(vec.begin() + k, vec.end());
n1 -= n2;
if (n1 <= 0){
cout << vec[k];
break;
}
}
}