题目链接:
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 }