【jzoj 1736】扑克游戏 {堆,哈夫曼树}

题目


解题思路

一道看起来不难的题目,用贪心试着拿部分分。结果合并果子的源程序竟然可以AC,让人惊讶! 当然,也不能是没有任何道理的。转载一份博客,供大家参考


代码(合并果子的源程序)

#include<cstdio>
 using namespace std; 
 int n,num,u,ans,a[100001]; 

 void up(int x)
 {
    int t; 
    while (x>1&&a[x]<a[x/2]) 
    {
        t=a[x/2]; a[x/2]=a[x]; a[x]=t; 
        x/=2; 
    }
 }

 void down(int x)
 {
    int y,t; 
    while ((a[x*2]<a[x]&&x*2<=num)||a[x*2+1]<a[x]&&x*2+1<=num)
    {
        y=x*2; 
        if (a[y+1]<a[x*2]&&x<=num) y++; 
        t=a[y]; a[y]=a[x]; a[x]=t; 
        x=y; 
    }
 }
 void insert(int x)
 {num++; a[num]=x; up(num);}
 int main() 
 {
     scanf("%d",&n); 
     for (int i=1;i<=n;i++)
      {scanf("%d",&u);insert(u);} 
     while (num!=1) 
     { 
        u=0; 
        u+=a[1]; 
        a[1]=a[num];
        num--;
        down(1);
        u+=a[1];
        a[1]=a[num];
        num--;
        down(1);
        insert(u);
        ans+=u; 
     }
    printf("%d",ans); 
 }

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/80945568
今日推荐