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

poj 3253 初涉二叉堆 模板题

时间:2016-02-11 06:43:10      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

这道题很久以前就做过了 当时是百度学习了优先队列 

后来发现其实还有个用sort的办法

就是默认sort排序后 a[i]+=a[i-1]

然后sort(a+i,a+i+n) (大概可以这样...答案忘了...)

嗯...其实标准解法是二叉堆..

主函数里面的while里面wa了好多次..

每次都选最小的那俩相加 再放回去

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int h[20050];
int n;
void chen(int i)
{
    int t;
    while(i*2<=n)
    {
        t=i*2;
        if(t+1<=n)
        {
            if(h[t]>h[t+1])
            {
                t++;
            }
        }
        if(h[i]>h[t])
        {
            int x=h[t];
            h[t]=h[i];
            h[i]=x;
            i=t;
        }
        else break;
    }
}
int main(){
while(~scanf("%d",&n))
{
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&h[i]);
    }
    for(int i=n/2;i>=1;i--)
        chen(i);
    long long int ans=0;
    while(n>1)
    {
        int minn=0;
        minn+=h[1];
        h[1]=h[n];
        n--;
        chen(1);
        minn+=h[1];
        h[1]=minn;
        chen(1);
        ans+=minn;


    }
    printf("%I64d\n",ans);
}
}

  

 

poj 3253 初涉二叉堆 模板题

标签:

原文地址:http://www.cnblogs.com/rayrayrainrain/p/5186270.html

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