POJ 4087:數據篩選

總時間限制: 
10000ms 
內存限制: 
3000kB
描述

小張需要從一批數量龐大的正整數中挑選出第k小的數,因爲數據量太龐大,挑選起來很費勁,希望你能編程幫他進行挑選。

輸入
第一行第一個是數據的個數n(10<=n<=106),第二個是需要挑選出的數據的序號k(1<=k<=105),n和k以空格分隔;
第二行以後是n個數據T(1<=T<=109),數據之間以空格或者換行符分隔。
輸出
第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;	
		}	
	}
} 


發佈了53 篇原創文章 · 獲贊 5 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章