题目大意:中文题目,你懂的。就是输入n个人的财富,找出m个大富翁。
解题思路:直接利用优先队列,对输入的数据进行排序,然后输出优先级最高的m项。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3785
STLcode:
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int num,n,m,k;
int main()
{
priority_queue<int> que;
while(scanf("%d%d",&n,&m)!=EOF && (m||n)){
for(int i=0;i<n;i++){
scanf("%d",&num);
que.push(num);
}
k = n>m ? m:n;//输出限制,如果n<m,则只输出n项
for(int j=0;j<k-1;j++){
printf("%d ",que.top());
que.pop();
}
printf("%d\n",que.top());
while(!que.empty()){//不要忘记每次清空队列,防止影响下一次操作
que.pop();
}
}
return 0;
}
本题另一种解法就是对输入数据进行排序,再输出前m项,code如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100010;
int n,m,k,numarr[MAXN];
bool cmp(int a,int b)
{
return a>b;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF && (m||n)){
for(int i=0;i<n;i++)
cin>>numarr[i];
sort(numarr,numarr+n,cmp);
k = n>m ? m :n;
for(int j=0;j<k-1;j++)
cout<<numarr[j]<<' ';
cout<<numarr[k-1]<<endl;
}
return 0;
}