2800: 【基础】装箱问题
时间限制: 1 Sec 内存限制: 32 MB
提交: 484 解决: 196
[提交] [状态] [讨论版] [命题人:ghost79]
题目描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1,2*2,3*3,4*4,5*5,6*6。这些产品通常使用一个6*6*h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
一行,六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量ai (0<=ai<=100)。
输出
输出一个整数代表订单所需的最小包裹数。
样例输入
样例1:
0 0 4 0 0 1
样例2:
7 5 1 0 0 0
样例输出
样例1:
2
样例2:
1
提示
30%的数据,只有6*6,5*5,4*4三种型号的产品。
100%的数据,0<=ai<=100。
题解如下
#include<stdio.h>
int main()
{
int ar[7]; //数组开大点,方便后期使用
for(int i=1;i<=6;i++)
{
scanf("%d",&ar[i]);
}
int sum_parcel=0; //总共需要的包裹数
for(int i=6;i>=1;i--) //循环分类讨论
{
if(ar[i]!=0)
{
if(i==6)
{
sum_parcel+=ar[i]; //ar[6]值为几 包裹加几个
ar[i]=0; //然后设为零值
}
else if(i==5)
{
sum_parcel+=ar[i]; //ar[5]有几个就需要多几个包裹,
int blank_area=11*ar[i]; //包裹剩余的空间只能用来 放1*1点箱子
ar[i]=0;
if(blank_area>=ar[1])
{
ar[1]=0;
}
else
{
ar[1]=ar[1]-blank_area;
}
}
else if(i==4)
{
sum_parcel+=ar[i]; //同理讨论一个包裹装上一个4*4点箱子
//此时还可以装的箱子的种类有 :2*2、1*1
int blank_area=ar[i]*20; //一下语句为 对它们的讨论
ar[i]=0;
if(blank_area>=ar[2]*4)
{
blank_area-=ar[2]*4;
ar[2]=0;
if(blank_area>=ar[1])
{
ar[1]=0;
}
else
{
ar[1]=ar[1]-blank_area;
}
}
else
{
ar[2]=(ar[2]*4-blank_area)/4;
}
}
else if(i==3) //当在一个包裹中 装了一个3*3之后
//还可以装的箱子种类有3*3、2*2、1*1
//以下为对它们的讨论
{
if(ar[i]%4==0)
{
sum_parcel+=ar[i]/4;
ar[i]=0;
}
else if(ar[i]%4!=0)
{
sum_parcel+=ar[i]/4+1;
if(ar[2]<=5)
{
int blank_area=(4-ar[i]%4)*9-4*ar[2];
ar[i]=0;
ar[2]=0;
if(blank_area>=ar[1])
{
ar[1]=0;
}
else
{
ar[1]=ar[1]-blank_area;
}
}
else if(ar[2]>5)
{
ar[2]-=5;
ar[i]=0;
}
}
//printf("i=%d",ar[i]);
}
else if(i==2)
{
int sum_2_area=4*ar[i];
if(sum_2_area%36!=0)
{
sum_parcel+=sum_2_area/36+1;
int blank_area=36*(sum_2_area/36+1)-4*ar[i];
ar[i]=0;
if(blank_area>=ar[1])
{
ar[1]=0;
}
else
{
ar[1]=ar[1]-blank_area;
}
}
else
{
sum_parcel+=sum_2_area/36;
ar[i]=0;
}
}
else if(i==1)
{
if(ar[i]>36)
{
sum_parcel+=ar[i]/36+1;
}
else
{
sum_parcel+=1;
}
}
}
}
printf("%d",sum_parcel);
return 0;
}