7-1 寻找大富翁 PTA 堆排序

7-1 寻找大富翁 (25 分)

胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。

输入格式:

输入首先给出两个正整数N(106​​)和M(10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。

输出格式:

在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。

输入样例:

8 3
8 12 7 3 20 9 5 18

输出样例:

20 18 12

简单的排序问题,快排超时了,换了堆排序就过了

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstdio>
#include <malloc.h>

#define INF 0x3f3f3f3f
#define FRER() freopen("in.txt", "r", stdin)
#define FREW() freopen("out.txt", "w", stdout)

using namespace std;

const int maxn = 1e6 + 5;

int num[maxn];

void adjust(int s, int m) {
    int temp = num[s];
    for(int j = s * 2; j <= m; j *= 2) {
        if(j < m && num[j] > num[j + 1]) ++j;
        if(temp <= num[j]) break;
        num[s] = num[j];
        s = j;
    }
    num[s] = temp;
}

void heapSort(int n) {
    for(int i = n / 2; i > 0; --i)
        adjust(i, n);
    for(int i = n; i > 1; --i) {
        swap(num[1], num[i]);
        adjust(1, i - 1);
    }
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++i) 
        scanf("%d", &num[i]);
    heapSort(n);
    for(int i = 1; i <= m && i <= n; ++i) {
        printf("%d%c", num[i], (i == m || i == n) ? '\n' : ' ');
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fan-jiaming/p/10072439.html