总时间限制: 10000ms 单个测试点时间限制: 5000ms 内存限制: 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
数据在int范围,一个int四个字节,假设n取最大值,那么,一次读入全部数据需要的内存空间大约是4M(不计程序),对于题目提供的3000KB,这显然是不够的,所以需要分段读入
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int n,k;
int main()
{
scanf("%d %d",&n,&k);
int i=0,val;
while(i<k){
scanf("%d",&val);
v.push_back(val);
++i;
}
make_heap(v.begin(),v.end());
while(i<n){
scanf("%d",&val);
if(v.front()>val){
pop_heap(v.begin(),v.end());
v.pop_back();
v.push_back(val);
push_heap(v.begin(),v.end());
}
++i;
}
printf("%d\n",v.front());
return 0;
}