龙珠游戏(二叉堆)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了龙珠游戏(二叉堆)相关的知识,希望对你有一定的参考价值。

龙珠游戏

在这里插入图片描述
在这里插入图片描述

解题思路

链表思想+二叉堆

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,len,a[100005],b[100005],next[100005];
struct node
{
	int x,i;
}tree[100005];
void put(node k)//存储
{
	tree[++len]=k;
	int son=len;
	while(son>1)
	{
		int fa=son/2;
		if(tree[son].x<=tree[fa].x)return;
		swap(tree[son],tree[fa]);
		son=fa;
	}
	return;
}
void get()//取值
{
	int i=tree[1].i;
	tree[1]=tree[len--];
	int fa=1;
	while(fa*2<=len)
	{
		int son=fa*2;
		if(son+1<=len&&tree[son].x<tree[son+1].x)son++;
		if(tree[son].x<=tree[fa].x)break;
		swap(tree[son],tree[fa]);
		fa=son;
	}
	if(b[i])return get();
	while(b[next[i]]&&next[i]<=n)next[i]=next[next[i]];
	if(next[i]>n)return get();
	printf("%d %d ",a[i],a[next[i]]);
	b[i]=b[next[i]]=1;
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	{
		tree[i]=(node){a[i],i};
		next[i]=i+1;
		if(i!=n)put(tree[i]);
	}
	for(int i=1;i<=n/2;i++)get();
	return 0;	
} 

谢谢

以上是关于龙珠游戏(二叉堆)的主要内容,如果未能解决你的问题,请参考以下文章

二叉堆的实现代码

python-数据结构代码 二叉堆

合并果子(二叉堆)

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 13 二叉堆

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 13 二叉堆

二叉堆(彻底整明白堆排序)