HDU 5884 Sort

Posted maoruimas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5884 Sort相关的知识,希望对你有一定的参考价值。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define rep(i,a,b) for(int i=a;i<=b;++i)
 4 #define ms(arr,a) memset(arr,a,sizeof arr)
 5 const int maxn=1e5+5;
 6 int N,C;
 7 int a[maxn],b[maxn],bf,be,af;
 8 bool ok(int w)
 9 {
10     if(w==1)return false;
11     int sum=0;
12     int f;
13     if(N%(w-1))f=N%(w-1);
14     else f=w-1;
15     bf=be=1;
16     af=f+1;
17     b[bf]=0;
18     rep(i,1,f)b[bf]+=a[i];
19     sum+=b[be];
20     rep(i,1,(N-f)/(w-1))
21     {
22         int tmp_sum=0;
23         rep(j,1,w)
24         {
25             if(bf>be){tmp_sum+=a[af++];continue;}
26             if(af>N){tmp_sum+=b[bf++];continue;}
27             if(b[bf]<a[af])tmp_sum+=b[bf++];
28             else tmp_sum+=a[af++];
29         }
30         b[++be]=tmp_sum;
31         sum+=b[be];
32     }
33     if(sum<=C)return true;
34     else return false;
35 }
36 int solve(int l,int r)
37 {
38     int m;
39     while(l<r)
40     {
41         m=(l+r)/2;
42         //printf("check on %d
",m);
43         if(ok(m))r=m;
44         else l=m+1;
45     }
46     return l;
47 }
48 int main()
49 {
50     int T;scanf("%d",&T);
51     while(T--)
52     {
53         scanf("%d%d",&N,&C);
54         rep(i,1,N)scanf("%d",a+i);
55         sort(a+1,a+N+1);
56         int ans=solve(1,N);
57         printf("%d
",ans);
58     }
59 }

 

以上是关于HDU 5884 Sort的主要内容,如果未能解决你的问题,请参考以下文章

hdu5884 Sort

HDU 5884 Sort (二分)

HDU 5884 Sort

HDU 5884 Sort(二分+优先队列)

HDU - 5884 - Sort

hdu5884 Sort(二分+k叉哈夫曼树)