poj 3253 初涉二叉堆 模板题

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

后来发现其实还有个用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 初涉二叉堆 模板题)