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的主要内容,如果未能解决你的问题,请参考以下文章