4671: 求前M大的数
时间限制(普通/Java):2000MS/20000MS 内存限制:65536KByte
描述
给定N个整数,求出前M大的数,并按照从小大到的顺序排序。
输入
第一行为两个正整数N和M(1<=N<=10000000, 1<=M<=10),第二行为N个非负整数。
输出
按照从小大到的顺序输出前M个整数,用空格隔开。
样例输入
5 3
3 1 2 5 4
样例输出
3 4 5
提示
由于数据量很大,请在输入数据时编写并调用以下函数读取一个非负整数:
//函数定义
int get() {
int r=0;
char c;
while(c=getchar(),!(c>=‘0’&&c<=‘9’));
r = c-‘0’;
while(c=getchar(),c>=‘0’&&c<=‘9’)
r = (r*10)+c-‘0’;
return r;
}
//读取一个整数示例
int n = get();
题目链接:http://tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=4671
题解
第一眼看到这题首先想到的是排序,但是数据太大排序肯定会TLE。只能在输入的时候判断书不是前M大的数。仔细一想可以使用优先队列完成判断,每次于对列中最小的数比较,如果大就最小数出列,当前数入列。
代码
#include<bits/stdc++.h>
using namespace std;
int get() {
int r=0;
char c;
while(c=getchar(),!(c>='0'&&c<='9'));
r = c-'0';
while(c=getchar(),c>='0'&&c<='9')
r = (r*10)+c-'0';
return r;
}
priority_queue<int, vector<int>, greater<int> >qi2;
int main()
{
int n=get();
int m=get();
int t;
for(int i=0;i<m;++i)
{
qi2.push(get());
}
n=n-m;
for(int i=0;i<n;++i)
{
t=get();
if(qi2.top()>t)continue;
if(t>qi2.top())
{
qi2.pop();
qi2.push(t);
}
}
t=qi2.top();
printf("%d",t);
qi2.pop();
while(!qi2.empty())
{
printf(" %d",qi2.top());
qi2.pop();
}
printf("\n");
}