数据结构实验之排序四:寻找大富翁
Time Limit: 200 ms Memory Limit: 512 KiB
Problem 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
Sample Output
188 60 56
Hint
请用堆排序完成。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cmp(int a, int b)
{
return a > b;
}
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
int a[15];
int cnt = 0;
int flag = 0;
memset(a, -1, sizeof(a));
for(int i = 0; i < n; i++)
{
int x;
scanf("%d", &x);
if(cnt < m)
{
a[cnt++] = x;
}
else
{
if(!flag)
sort(a, a+m, cmp);
flag = 1;
int j;
for( j = m-1; j >= 0&&a[j] < x; j--)
{
a[j+1] = a[j];
}
a[j+1] = x;
}
}
for(int i = 0; i < m; i++)
printf("%d ",a[i]);
}
return 0;
}