POJ P1017 Question Report
Packets
时间限制:
1000毫
秒
|
内存限制:
10000 k
|
有道翻译
(垃圾翻译不如去看题解)
描述(机翻忒辣鸡)
工厂生产的产品装在方形包的
同一高度(h)和大小的1 * 1,2 * 2,3 * 3,4 * 4,5 * 5,6 * 6。广场上的这些产品总是交付给客户的包裹一样高(h)的产品和尺寸6 * 6。因为费用是工厂的利益以及客户的包裹需要交付的数量
降到最低订购了产品从工厂到客户。一个好的程序解决问题
找到所需的最小数量的包裹交付给产品根据订单会省下一大笔钱。你被要求做这样的一个程序。
输入
输入文件包含几行指定命令。每一行指定一个秩序。订单被
六个整数隔开一个空格代表先后个体大小的数据包的数量从
最小的尺寸1 * 1的最大尺寸6 * 6。输入文件的结束由线表示包含六个零。
输出
输出文件包含一行输入文件中的每一行。这一行包含订单的最小数量的包裹从相应的输入文件可以包装。
没有线相对应的输出文件的最后一个“零”行输入文件。
样例输入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出
2
1
代码:
标程
//POJ1017 pjQ1
//贪心(思想) 暴力,枚举 穷举
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int a1,a2,a3,a4,a5,a6;
//6种size的盒子数量
while(1==1){
scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6);
if(a1==0 && a2==0 && a3==0 && a4==0 && a5==0 && a6==0){
break;
}
int PackNum=0;
//放进所有盒子所需的最少箱子数
PackNum+=a6;
//6*6的盒子,每个都刚好独占一个箱子
//=============
PackNum+=a5;
//5*5的盒子,放进箱子后,每个箱子余下的空间只能放11个1*1的盒子
a1=max(0,a1-a5*11);
//把1*1的盒子尽可能地放进已放有一个5*5盒子的箱子
//=============
PackNum+=a4;
//4*4的盒子,放进箱子后,每个箱子余下的空间为5个2*2的盒子空间
if(a2>=a4*5){
//先把所有2*2的盒子尽可能地放进这些空间 若2*2的盒子数比空间多
a2-=a4*5;
//则消去已放进空间的部分
}
else
//若2*2的盒子数比空间少
{
//则先把所有2*2的盒子放进这些空间
a1=max(0,a1-4*(a4*5-a2));
//再用1*1的盒子填充本应放2*2盒子的空间
a2=0;
//一个2*2空间可放4个1*1盒子
}
//=============
PackNum+=(a3+3)/4;
//每4个3*3的盒子完全独占一个箱子
a3%=4;
//3*3的盒子不足4个时,都放入一个箱子,剩余空间先放2*2,再放1*1
if(a3){
if(a2>=7-2*a3){
//当箱子放了i个3*3盒子,剩下的空间最多放j个2*2盒子
a2-=7-2*a3;
//其中i={1,2,3} ; j={5,3,1} 由此可得到条件的关系式
a1=max(0,a1-(8-a3));
//当箱子放了i个3*3盒子,并尽可能多地放了个2*2盒子后
}
//剩下的空间最多放j个1*1盒子,其中i={1,2,3} ; j={7,6,5}
else
//但当2*2的盒子数不足时,尽可能把1*1盒子放入剩余空间
{
//一个箱子最多放36个1*1,一个3*3盒子空间最多放9个1*1,一个2*2盒子空间最多放4个1*1
a1=max(0,a1-(36-9*a3-4*a2));
//由此很容易推出剩余空间能放多少个1*1
a2=0;
}
}
//==============
PackNum+=(a2+8)/9;
//每9个2*2的盒子完全独占一个箱子
a2%=9;
//2*2的盒子不足9个时,都放入一个箱子,剩余空间全放1*1
if(a2){
a1=max(0,a1-(36-a2*4));
}
//==============
PackNum+=(a1+35)/36;
//每36个1*1的盒子完全独占一个箱子
printf("%d\n",PackNum);
}
return 0;
}