POJ1017

POJ1017题目链接:http://poj.org/problem?id=1017

题目大意,该公司生产的产品有六种型号(规格)底面为1*1、2*2、3*3、4*4、5*5、6*6高位h,现在要把它们放入高度也为h,底面为6*6的包装箱中,问最少需要几个箱子。

解题思路(贪心思想)由于一些产品的特殊性,4*4、5*5、6*6的每种产品要一个箱子,并同时有剩余空间,尽可能的在剩余空间中放入2*2的产品,之后放1*1的产品。这里的一个难点应在于3*3的产品的个数不定会有不同的结果,1、四的倍数时,没有剩余空间;2、除四余一时可以放5个2*2;3、除四余二时可以放3个2*2;4、除四余三时可以放一个2*2的;计算利用剩余空间可以放多少个1*1的产品时,可以用逆向思维,拿现有的箱子数*36减去放1*1之前的各种产品所占的空间,就是可以放1*1的了。

1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5 int x1,x2,x3,x4,x5,x6,n,i,j;/*x1..x6分别存储1*1到6*6的箱子个数
6 i存储在放2*2箱子之前(先放大的箱子)放各种箱子时利用剩余空间可以放2*2的箱子数
7 j类似于i存1*1的 这里使用了逆向思维拿已有的箱子总空间减去以占有的空间*/
8 int a[]={0,5,3,1}; //放3*3箱子余数为0..3时可以放的2*2的箱子总数
9 while (cin>>x1>>x2>>x3>>x4>>x5>>x6)
10 {
11 n=0;
12 if(x1+x2+x3+x4+x5+x6==0)break;
13 n+=x6+x5+x4+(x3+3)/4; //这里的x3+3和下面的几个一样 都是一个处理上的技巧 当整除是不想影响结果,不整除时可以去整除数+1(即上限)
14 i=x4*5+a[x3%4];
15 if(x2>i)
16 n+=(x2-i+8)/9;
17 j=n*36-x6*36-x5*25-x4*16-x3*9-x2*4;
18 if(x1>j) //剩余的空间不够使用时 重新审请
19 n+=(x1-j+35)/36;
20 cout<<n<<endl;
21 }
22 return 0;
23 }
posted @ 2011-07-03 19:16  我们一直在努力  阅读(432)  评论(0编辑  收藏  举报