hdoj 3785 寻找大富翁【优先队列+sort排序】
寻找大富翁
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4504 Accepted Submission(s): 1838
Problem Description
浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
Input
输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
Output
请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
Sample Input
3 1
2 5 -1
5
3
1 2 3 4 5
0 0
Sample Output
5
5 4 3
本来以为优先队列速度会快点结果只快了100多ms
sort排序:
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int str[100010]; int main() { int n,m,j,i,s,t; while(scanf("%d%d",&n,&m)&&n!=0&&m!=0) { for(i=0;i<n;i++) { scanf("%d",&str[i]); } sort(str,str+n,cmp); if(n>m) { for(i=0;i<m;i++) { if(i==0) printf("%d",str[i]); else printf(" %d",str[i]); } printf("\n"); } else { for(i=0;i<n;i++) { if(i==0) printf("%d",str[i]); else printf(" %d",str[i]); } printf("\n"); } } return 0; }
优先队列:
#include<stdio.h> #include<queue> using namespace std; int main() { int n,m,j,i,t,k; while(scanf("%d%d",&n,&m)&&n!=0&&m!=0) { priority_queue<int>q; int c=n; while(c--) { scanf("%d",&t); q.push(t); } if(n<m) { k=n;n=m;m=k; } int a=n-m; int p=0; while(q.size()>a) { if(p==0) printf("%d",q.top()); else printf(" %d",q.top()); p++; q.pop(); } printf("\n"); } return 0; }