题目来源:http://ac.jobdu.com/problem.php?pid=1431
-
题目描述:
-
给你n个整数,请按从大到小的顺序输出其中前m大的数。
-
输入:
-
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
-
输出:
-
对每组测试数据按从大到小的顺序输出前m大的数。
-
样例输入:
-
5 3 3 -35 92 213 -644
-
样例输出:
-
213 92 3
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
using namespace std;
const int MAXN = 1000010;
int main()
{
int n, k, iData, i;
int arr[MAXN];
set <int, less<int> > InsertNum;
typedef set <int, less<int> >::iterator InsertSet;
while(~scanf("%d %d", &n, &k))
{
InsertNum.clear();
if(n <= 0 || k <= 0 || k > n)
continue ;
for(i = 0; i < n; ++i)
{
scanf("%d", &iData);
if(InsertNum.size() < k)
InsertNum.insert(iData);
else
{
InsertSet tmp = InsertNum.begin();
if(iData > *(InsertNum.begin()))
{
InsertNum.erase(tmp);
InsertNum.insert(iData);
}
}
}
set <int, less<int> >::iterator iter = InsertNum.begin();
int num = 0;
for(; iter != InsertNum.end(); ++iter)
arr[num++] = *iter;
printf("%d", arr[k-1]);
for(i = k-2; i >= 0; --i)
printf(" %d", arr[i]);
printf("\n");
}
return 0;
}
优先级队列:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int main()
{
priority_queue <int> Q;
int n, m, iData, i;
while(~scanf("%d %d", &n, &m))
{
for(i = 0; i < n; ++i)
{
scanf("%d", &iData);
Q.push(iData);
}
if(m > n)
continue ;
cout<<Q.top();
Q.pop();
int iNum = 1;
while(iNum < m && !Q.empty())
{
cout<<" "<<Q.top();
Q.pop();
iNum++;
}
cout<<endl;
while(!Q.empty())
Q.pop();
}
return 0;
}