A - 1-1 寻找大富翁 HDU - 3785
Statement
浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
Input
输入包含多组测试用例.
每个用例首先包含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
Output
5
5 4 3
Solution
一开始直接sort TEL了三发 sort 的是时间复杂度是 N*log( N )
后面用了priority_queue
top( ) 读一个
pop( ) 弹一个出来
priority_queue 的时间复杂度是 log( N )
push(x)
将元素x压入priority_queue,时间复杂度为log(N)top()
取队首元素,即堆顶元素,时间复杂度O(1)pop()
队首元素(堆顶元素)出队empty()
检测优先队列是否为空,时间复杂度O(1)size()
返回优先队列元素个数,时间复杂度O(1)
priority_queue<int> q1; //大根堆 priority_queue<int, vector<int>, less<int>> q2; //大根堆 priority_queue<int, vector<int>, greater<int>> q3; // 小根堆
Code
超时代码:
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long int ll;
const ll N = 4e6 + 10;
const ll NN = 1e7+5;
const ll INF = 0x7fffffff;
ll k[N],p[N];
int main() {
ll n,m;
while(~scanf("%lld%lld",&n,&m)) {
if(n==0&&m==0) {
break;
}
for(int i=0; i<n; i++) {
cin>>k[i];
}
sort(k,k+n,cmp);
if(n<m) {
for(int i=0; i<n; i++) {
if(i!=n-1)cout<<k[i]<<" ";
else cout<<k[i];
}
cout<<endl;
} else {
for(int i=0; i<m; i++) {
if(i!=n-1)cout<<k[i]<<" ";
else cout<<k[i];
}
cout<<endl;
}
}
return 0;
}
正解:
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define endl '\n'
typedef long long int ll;
const ll N = 4e6 + 10;
const ll NN = 1e7+5;
const ll INF = 0x7fffffff;
ll k[N],p[N];
ll cmp(ll a,ll b) {
return a>b;
}
int main() {
int n,m,t;
while(~scanf("%d%d",&n,&m)) {
priority_queue<int> q;
if(n==0&&m==0)
break;
for(int i=0; i<n; i++) {
scanf("%d",&t);
q.push(t);
}
m=min(n,m);
for(int i=0; i<m; i++) {
if(i!=0)
printf(" ");
int tmp=q.top() ;
printf("%d",tmp);
q.pop();
}
printf("\n");
}
return 0;
}
这篇文章介绍了如何使用优先队列优化算法来解决浙江桐乡乌镇寻找前m个大富翁的问题,通过对比两种方法并展示了高效的时间复杂度。
3万+

被折叠的 条评论
为什么被折叠?



