首页 > 代码库 > 贪心(哈夫曼树):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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。