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 */

 

posted @ 2019-08-05 09:23  SpringYEP  阅读(175)  评论(0编辑  收藏  举报