POJ 4087:数据筛选

9 篇文章 0 订阅

总时间限制: 
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

这题灰常简单,注意以下几点:
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;	
		}	
	}
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值