龙珠游戏(二叉堆)
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;
}
谢谢
以上是关于龙珠游戏(二叉堆)的主要内容,如果未能解决你的问题,请参考以下文章
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 13 二叉堆