2019牛客暑期多校训练营(第六场)D-Move
[题目大意]
n个物品及其体积,用k个相同的箱子装,求能装下这n个物品的箱子的最小容积。
对于一个箱子,每次都先装能装下的最大的物品,不能满足则开始装下一个箱子。
[思路]
ans = max ( vol [i] , ceil(sum ( vol [i]] ) / k )) ,while(ans++)直到能装下所有物品。
[代码]
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e3+3; 4 int arr[maxn]; 5 int n,m; 6 int vol[maxn]; 7 bool check(int now) 8 { 9 int num_box=0; 10 memset(vol,0,sizeof(vol)); 11 for(int i=n; i>=1; i--) 12 { 13 bool flag=false; 14 for(int j=0; j<num_box; j++) 15 { 16 if(vol[j]+arr[i]<=now) 17 { 18 vol[j]+=arr[i]; 19 flag=true; 20 break; 21 } 22 } 23 if(!flag) 24 { 25 vol[num_box]=arr[i]; 26 num_box++; 27 } 28 if(num_box>m)return false; 29 } 30 return true; 31 } 32 int main() 33 { 34 int t; 35 scanf("%d",&t); 36 int k=1; 37 while(k<=t) 38 { 39 int ans=0; 40 int sum=0; 41 scanf("%d%d",&n,&m); 42 for(int i=1; i<=n; i++) 43 { 44 scanf("%d",&arr[i]); 45 sum+=arr[i]; 46 ans=max(arr[i],ans); 47 } 48 ans=max(ans,sum/m); 49 sort(arr+1,arr+n+1); 50 while(!check(ans)) 51 { 52 ans++; 53 } 54 printf("Case #%d: %d\n",k,ans); 55 k++; 56 } 57 return 0; 58 } 59 /* 60 3 61 3 2 62 6 6 7 63 5 3 64 1 2 3 4 5 65 */