首页 > 代码库 > 贪心(哈夫曼树):HDU 5884 sort

贪心(哈夫曼树):HDU 5884 sort

技术分享

  这道题目,我做的时候不会哈夫曼树,自己贪心是错的都不知晓。还可以发现这里不必用优先队列,可以用两个队列,毕竟插入的数是有单调性的。

 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 const int N=300010; 7 int a[N],n,S,f1,f2,b1,b2; 8 int q1[N],q2[N]; 9 bool Check(int k){10     f1=b1=f2=b2=0;11     for(int i=1;i<=n;i++)12         q1[b1++]=a[i];13     for(int i=0;(n+i-1)%(k-1);i++)14         q2[b2++]=0;15     int tot=0,tmp;16     while(true){tmp=0;17         for(int i=1;i<=k;i++){18             if(f1==b1)tmp+=q2[f2++];19             else if(f2==b2)tmp+=q1[f1++];20             else if(q1[f1]<q2[f2])tmp+=q1[f1++];21             else tmp+=q2[f2++];22         }tot+=tmp;23         if(f1>=b1&&f2>=b2)break;24         q2[b2++]=tmp;25     }    26     return tot<=S;27 }28 int main(){29     int T;30     scanf("%d",&T);31     while(T--){32         scanf("%d%d",&n,&S);33         for(int i=1;i<=n;i++){34             scanf("%d",&a[i]);35         }     36         sort(a+1,a+n+1);37         int lo=2,hi=n;38         while(lo<=hi){39             int mid=(lo+hi)>>1;40             if(Check(mid))hi=mid-1;41             else lo=mid+1;42         }43         printf("%d\n",lo);44     }45     return 0;46 }

 

贪心(哈夫曼树):HDU 5884 sort