简单题意
包装盒为6*6的方盒,礼品为方形边长依次为1,2,3,4,5,6,用最少的包装盒,装下给出的礼品
解题思路形成过程
我是想从大的礼品开始包装,通过6个while循环包装从大到小的礼品,对于长为6礼品一个盒子只能装下他一个,对于边长为5的礼品一个盒子装下他之后还可以装下11个边长为1的,对于边长为4的,装完一个后可以最多装5个边长为2的,如果不够则将剩下的空间转化成装长为1的空间,对于边长为3的,装完一个后可以装下3个边长为3的,如果不够,要分别考虑剩下的空间能装几个边长为1和2的,2不够再转为1,对于边长为2的一个包装盒可以最多盛下9个,不够的话剩下的空间转为1,最后对于边长为1的,一个盒子最多可以装满36个,因此这种方法通过前面的循环可以大幅削减边长为1和2的数量,尤其是长为1的。
感想
这种方法需要有明确的思路,也是上c++实验课完成的题目,写的代码太长了点,本还以为会超时还特意改了cin为scanf,最后提交上去竟然AC了,上课编的两道题都AC了,感觉有点不可思议
AC代码
#include <iostream>
#include <stdio.h>
#include <fstream>
using namespace std;
int main(){
ifstream cin("in.txt");
int a1,a2,a3,a4,a5,a6;
while( scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6)&&(a1||a2||a3||a4||a5||a6)){
int cnt=0;
while(a6>0){
cnt++;
a6--;
}
while(a5>0){
cnt++;
a5--;
if(a1>0){
if(a1>=11){
a1-=11;
}else{
a1=0;
}
}
}
while(a4>0){
cnt++;
a4--;
int left;
if(a2>0){
if(a2>=5){
a2-=5;
continue;
}else{
left=20-4*a2;
a2=0;
}
}
if(a1>0){
if(a1>left)a1-=left;
else a1=0;
}
}
while(a3>0){
cnt++;
a3--;
int left1;
int left2;
if(a3>=3){
a3-=3;
continue;
}else{
switch(a3){
case 0:left2=5;left1=7;break;
case 1:left2=3;left1=6;break;
default :left2=1;left1=5;break;
}
a3=0;
}
if(a2>0){
if(a2>left2){
a2-=left2;
}else{
left1=left1+(left2-a2)*4;
a2=0;
}
}
if(a1>0){
if(a1>left1){
a1-=left1;
}else{
a1=0;
}
}
}
while(a2>0){
cnt++;a2--;
int left1;
if(a2>=8){
a2-=8;
continue;
}else{
left1=(8-a2)*4;
a2=0;
}
if(a1>0){
if(a1>left1)a1-=left1;
else a1=0;
}
}
while(a1>0){
cnt++;
if(a1>36)a1-=36;
else a1=0;
}
cout<<cnt<<endl;
}
return 0;
}
#include <stdio.h>
#include <fstream>
using namespace std;
int main(){
ifstream cin("in.txt");
int a1,a2,a3,a4,a5,a6;
while( scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6)&&(a1||a2||a3||a4||a5||a6)){
int cnt=0;
while(a6>0){
cnt++;
a6--;
}
while(a5>0){
cnt++;
a5--;
if(a1>0){
if(a1>=11){
a1-=11;
}else{
a1=0;
}
}
}
while(a4>0){
cnt++;
a4--;
int left;
if(a2>0){
if(a2>=5){
a2-=5;
continue;
}else{
left=20-4*a2;
a2=0;
}
}
if(a1>0){
if(a1>left)a1-=left;
else a1=0;
}
}
while(a3>0){
cnt++;
a3--;
int left1;
int left2;
if(a3>=3){
a3-=3;
continue;
}else{
switch(a3){
case 0:left2=5;left1=7;break;
case 1:left2=3;left1=6;break;
default :left2=1;left1=5;break;
}
a3=0;
}
if(a2>0){
if(a2>left2){
a2-=left2;
}else{
left1=left1+(left2-a2)*4;
a2=0;
}
}
if(a1>0){
if(a1>left1){
a1-=left1;
}else{
a1=0;
}
}
}
while(a2>0){
cnt++;a2--;
int left1;
if(a2>=8){
a2-=8;
continue;
}else{
left1=(8-a2)*4;
a2=0;
}
if(a1>0){
if(a1>left1)a1-=left1;
else a1=0;
}
}
while(a1>0){
cnt++;
if(a1>36)a1-=36;
else a1=0;
}
cout<<cnt<<endl;
}
return 0;
}