码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder 1105 题外话·堆 堆的应用

时间:2015-01-27 11:20:47      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:c++

题目链接:

1105







一共两种操作 放入和取出(MAX)的

最多有10W次操作 ,暴力肯定会超时。

我们可以将盒子理解为一个大顶堆,即父节点大于左右子节点。

1.每次放入糖果时往上维护堆

2.取出时模仿堆排序的算法 将根节点(max)输出并与最后一个节点交换  再维护堆






代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int q[100005];
void HeapAdjust(int loc,int len)
{
    int pos=loc,leftchild=2*loc,rightchild=2*loc+1;
    if(loc<=len/2)
    {
        if(leftchild<=len&&q[leftchild]>q[pos])
            pos=leftchild;
        if(rightchild<=len&&q[rightchild]>q[pos])
            pos=rightchild;
        if(pos!=loc)
        {
            swap(q[pos],q[loc]);
            HeapAdjust(pos,len);
        }
    }
    return;
}
int main()
{
    int n,len=0,b;
    char a;
    scanf("%d",&n);
    getchar();
    for(int j=1;j<=n;j++)
    {
        cin>>a;
        if(a=='A')
        {
            scanf("%d",&q[++len]);
            int l=len/2;
            while(l!=0)                 //依次往上维护堆  
            {
                HeapAdjust(l,len);
                l=l/2;
            }
            getchar();
        }
        else if(a=='T')
        {
            printf("%d\n",q[1]);
            swap(q[1],q[len--]);
            HeapAdjust(1,len);          //维护
        }
    }
    return 0;
}






hihocoder 1105 题外话·堆 堆的应用

标签:c++

原文地址:http://blog.csdn.net/axuan_k/article/details/43191003

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!