数据结构实验之排序四:寻找大富翁(堆排序)



数据结构实验之排序四:寻找大富翁

Time Limit: 150MS Memory limit: 512K

题目描述

2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。

输入

首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。

输出

一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。
 

示例输入

6 3
12 6 56 23 188 60

示例输出

188 60 56
 
  
 
  
 
  
#include<bits/stdc++.h>
using namespace std;
int a[10];
void hmaintain(int x,int m)
{
    int l=x<<1;
    int r=x<<1|1;
    int ma=x;
    if(x<=m/2)
    {
        if(l<=m&&a[l]<a[ma])
            ma=l;
        if(r<=m&&a[r]<a[ma])
            ma=r;
        if(ma!=x)
        {
            swap(a[x],a[ma]);
            hmaintain(ma,m);
        }
    }
}
int op(int a,int b)
{
    return a>b;
}
int main()
{
    int n,m,i,j,k;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=1;i<=m;i++)
            scanf("%d",&a[i]);
        for(i=m/2;i>=1;--i)
            hmaintain(i,m);

        for(i=m+1;i<=n;i++)
        {
            scanf("%d",&k);
            if(k>a[1])
            {
                a[1]=k;
                for(j=m/2;j>=1;--j)
                    hmaintain(j,m);
            }
        }
        sort(a+1,a+m+1,op);
        for(i=1;i<=m;++i)
            printf(i==m?"%d\n":"%d ",a[i]);
    }
    return 0;
}



数据结构实验之排序四:寻找大富翁

Time Limit: 150MS Memory limit: 512K

题目描述

2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。

输入

首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。

输出

一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。
 

示例输入

6 3
12 6 56 23 188 60

示例输出

188 60 56

你可能感兴趣的:(排序)