这道题目,我做的时候不会哈夫曼树,自己贪心是错的都不知晓。还可以发现这里不必用优先队列,可以用两个队列,毕竟插入的数是有单调性的。
1 #include2 #include 3 #include 4 #include 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] =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 }