POJ1017 Packets---贪心

题目链接:

https://vjudge.net/problem/POJ-1017

题目大意:

公司共有底面面积为1*1、2*2、3*3、4*4、5*5、6*6,高度同为H的六种产品,现在需要用最少的箱子打包,箱子的底面面积为6*6,高度为H。

思路:

     简单的暴力贪心算法,对不同的产品有不同的策略,按照从大到小的顺序打包产品,策略如下:

     6*6:1个产品放在1个箱子里

     5*5:1个产品要占用1个箱子,用1*1的箱子可以填充(11个填满1箱)

     4*4:1个产品要占用1个箱子,剩余空间用2*2和1*1的箱子填充(先填充2*2,再填充1*1)

     3*3:4个产品可以填满1个箱子,假如有不满1个箱子的,分情况用1*1和2*2的产品填满

     2*2:9个产品可以填满1个箱子,假如有不满1个箱子的,用1*1的产品填充

     1*1:36个产品可填满一个箱子

 1 #include<iostream>
 2 #include<set>
 3 #include<map>
 4 #include<queue>
 5 #include<vector>
 6 #include<algorithm>
 7 #include<cstring>
 8 #include<cstdio>
 9 #include<cmath>
10 using namespace std;
11 typedef long long ll;
12 
13 int main()
14 {
15     int a, b, c, d, e, f;
16     while(cin >> a >> b >> c >> d >> e >>f && (a + b + c + d + e + f))
17     {
18         int ans = d + e + f + (c + 3) / 4;
19         int aa = a, bb = b, cc = c;
20         aa -= e * 11;
21         if(aa < 0)aa = 0;
22         bb -= d * 5;
23         if(bb < 0)
24         {
25             bb = 0;
26             aa -= (d * 20 - b * 4);
27             if(aa < 0)aa = 0;
28         }
29         if(c % 4 == 3)
30         {
31             if(bb >= 1)
32             {
33                 bb--;
34                 aa -= 5;
35             }
36             else
37             {
38                 aa -= 9;
39             }
40         }
41         else if(c % 4 == 2)
42         {
43             if(bb >= 3)bb -= 3,aa -= 6;
44             else if(bb == 2)bb = 0,aa -= 10;
45             else if(bb)bb = 0, aa -= 14;
46             else a -= 18;
47         }
48         else if( c % 4 == 1)
49         {
50             if(bb >= 5) bb -= 5, aa -= 7;
51             else 
52             {
53                 bb = 0;
54                 if(bb == 4)aa -= 11;
55                 else if(bb == 3)aa -= 15;
56                 else if(bb == 2)aa -= 19;
57                 else if(bb == 1)aa -= 23;
58                 else aa -= 27;
59             }
60         }
61         else;
62         if(aa < 0)aa = 0;
63         if(bb < 0)bb = 0;
64         ans = ans + (bb * 4 + aa + 35) / 36;
65         cout<<ans<<endl;
66     }
67 }

 

转载于:https://www.cnblogs.com/fzl194/p/8696260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值