Description
2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。
Input
首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。
Output
一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。
Sample
Input
6 3
12 6 56 23 188 60
Output
188 60 56
Hint
请用堆排序完成。
//优先队列实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m, t;
priority_queue< int, vector<int>, greater<int> >q;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)
{
scanf("%d", &t);
q.push(t);
}
for(int i = 0; i < n - m; i++)
{
scanf("%d", &t);
if(t > q.top())
{
q.pop();
q.push(t);
}
}
stack<int> p;
while(!q.empty())
{
p.push(q.top());
q.pop();
}
while(!p.empty())
{
if(p.size() == 1)
cout << p.top() << endl;
else
cout << p.top() << " ";
p.pop();
}
return 0;
}
//一般方法
#include<bits/stdc++.h>
using namespace std;
int h[20];
int m;
void shiftDown(int i)
{
int t, flag = 0;
while(2 * i <= m && flag == 0)
{
if(h[i] > h[2 * i])
t = 2 * i;
else
t = i;
if(2 * i + 1 <= m)
{
if(h[t] > h[2 * i + 1])
t = 2 * i + 1;
}
if(t != i)
{
swap(h[t], h[i]);
i = t;
}
else flag = 1;
}
}
int main()
{
ios::sync_with_stdio(0);
int n, len;
cin >> len >> m;
for(int i = 1; i <= m; i++)
cin >> h[i];
for(int i = m / 2; i >= 1; i--)
shiftDown(i);
n = m;
for(int i = m + 1; i <= len; i++)
{
int k;
cin >> k;
if(k > h[1])
{
h[1] = k;
for(int j = m / 2; j >= 1; j--)
shiftDown(j);
}
}
while(m > 1)
{
swap(h[m], h[1]);
m--;
shiftDown(m);
}
for(int i = 1; i <= n; i++)
{
printf("%d%c",h[i], i == n ? '\n' : ' ');
}
return 0;
}