hdu 1280 手写堆排序(堆排序模板)

#include <bits/stdc++.h>

using namespace std;

int a[1000 + 20];  //放堆的数组
int cnt;           //堆里边的个数
void up(int p) {  //添加末尾节点,每次跟父节点对比,把小的调整到上边
    while (p != 1) {
        if (a[p / 2] >= a[p]) {
            swap(a[p], a[p / 2]);
            p /= 2;
        } else
            break;
    }
}
void inser(int n) {
    a[++cnt] = n;
    up(cnt);
}
void down(int p) {
    while (1) {
        if (p * 2 + 1 <= cnt) {  //有两个子节点
            if (a[p * 2] <= a[p * 2 + 1]) {
                a[p] = a[p * 2];
                p = p * 2;
            } else {
                a[p] = a[p * 2 + 1];
                p = p * 2 + 1;
            }
        } 
        /*else if (p * 2 == cnt) {  //只有一个子节点,这种情况可以归在下边的那个代码里。
            a[p] = a[p * 2];
            return;
        }*/ 
        else {  //没有子节点,目前到了叶子节点
            a[p] = a[cnt];
            up(p);  //挪过来的末尾的节点不一定符合这边的关系,更新
            return;
        }
    }
}

void pop() {
    down(1);
    cnt--;
}

int b[3020];
int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) != EOF) {
        cnt = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%d", b + i);
        }
        for (int i = 1; i < n; i++) {
            for (int j = i + 1; j <= n; j++) {
                if (cnt < m) {
                    inser(b[i] + b[j]);
                } else if (b[i] + b[j] > a[1]) {
                    pop();
                    inser(b[i] + b[j]);
                }
            }
        }
        int ans[1020];
        for (int i = 1; i <= m; i++) {
            ans[i] = a[1];
            pop();
        }
        for (int i = m; i >= 1; i--) {
            printf("%d", ans[i]);
            if (i != 1) printf(" ");
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值