P1631 序列合并(二叉堆)

P1631 序列合并icon-default.png?t=M276https://www.luogu.com.cn/problem/P1631

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
#include <cstdlib>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 2000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)

int n;
int a[MAXN];
int b[MAXN];
struct node {
	int x, y, z;
	node() {

	}
	node(int x1, int y1, int z1): x(x1), y(y1), z(z1) {

	}
	bool operator < (const node &b)const {
		return x > b.x;
	}
};

int main() {
	priority_queue<node, vector<node> > que;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", a + i);
	}
	for (int i = 1; i <= n; i++) {
		scanf("%d", b + i);
	}
	for (int i = 1; i <= n; i++) {
		que.push(node(a[i] + b[1], i, 1));
	}
	node t;
	for (int i = 1; i <= n; i++) {
		printf("%d ", que.top().x);
		t = que.top();
		que.pop();
		que.push(node(a[t.y] + b[t.z + 1], t.y, t.z + 1));
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
任务1: 1)二叉树的二叉链表结构定义如下: typedef struct BiTNode{ char data; // 数据域 struct BiTNode *lchild, *rchild; // 左右孩子指针 }BiTNode, *BiTree; 2)求二叉树的叶子结点数的算法如下: int countLeaf(BiTree root){ if(root == NULL){ return 0; // 空树没有叶子结点 }else if(root->lchild == NULL && root->rchild == NULL){ return 1; // 叶子结点 }else{ return countLeaf(root->lchild) + countLeaf(root->rchild); // 递归求左右子树的叶子结点数之和 } } 任务2: 1)树的孩子链表法存储结构定义如下: typedef struct CTNode{ int child; // 孩子结点在数组中的下标 struct CTNode *next; // 下一个孩子结点指针 }*ChildPtr; typedef struct{ char data; // 数据域 ChildPtr firstchild; // 第一个孩子结点指针 }CTBox; typedef struct{ CTBox nodes[MAXSIZE]; // 结点数组 int n, r; // 结点数和根结点在数组中的下标 }CTree; 2)求下标为i的结点的双亲的算法如下: int getParent(CTree tree, int i){ for(int j = 0; j < tree.n; j++){ ChildPtr p = tree.nodes[j].firstchild; while(p != NULL){ if(p->child == i){ return j; // 找到双亲结点 } p = p->next; } } return -1; // 没有找到双亲结点 } 任务3: 哈夫曼树的构建过程如下: 1)将权值从小到大排序,得到序列{1, 5, 7, 8, 14, 20, 28}。 2)将权值最小的两个结点合并,得到新的结点15,其权值为1+5=6,将其插入到序列中,得到{6, 7, 8, 14, 15, 20, 28}。 3)重复步骤2,得到{13, 14, 15, 20, 28}。 4)重复步骤2,得到{27, 28}。 5)最后剩下的两个结点合并,得到新的根结点55,其权值为27+28=55。 哈夫曼树如下所示: 55 / \ 27 28 / \ 13 14 / \ 1 5 WPL = 1*2 + 5*2 + 7*2 + 8*2 + 14*2 + 20*2 + 28*2 = 196。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值