贪心(哈夫曼树):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 }

 

转载于:https://www.cnblogs.com/TenderRun/p/5883099.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值