您的位置:首页 > 大数据 > 人工智能

poj bailian 1017装箱问题

2018-03-20 22:22 302 查看
没有对比,没有伤害!

我的代码

思路是贪心的思想,从大往小装,将盒子中剩余的空间,装小的。

每新增加一个盒子,就从大往小遍历一遍,尽可能装。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int cnt[10],space[10];
void Fill(){
while(space[3]&&cnt[3]){
--space[3];--cnt[3];
}
if(space[3]==1) {space[2]+=1;space[1]+=5;}
if(space[3]==2){space[2]+=3;space[1]+=6;}
if(space[3]==3){space[2]+=5;space[1]+=7;}
while(space[2]&&cnt[2]) {--space[2];--cnt[2];}
space[1]+=2*space[2];
while(space[1]&&cnt[1]) {--space[1];--cnt[1];}
memset(space,0,sizeof(space));
}
int main(){
while(1){
memset(cnt,0,sizeof(cnt));
memset(space,0,sizeof(space));
for(int i=1;i<=6;++i) scanf("%d",&cnt[i]);
int s=0;
for(int i=1;i<=6;++i) s+=cnt[i];
if(s==0) return 0;
int ans=0;
for(int i=6;i;--i){
if(cnt[i]==0) continue;
if(i>3){
for(int j=cnt[i];j>0;--j){
--cnt[i]; ++ans;
if(i==5) {space[1]+=11;Fill();}
if(i==4) {space[2]+=5;Fill();}
}
}
if(i==3){
ans+=cnt[3]/4; cnt[3]%=4;
if(cnt[3]){
ans++;space[3]=4-cnt[3];cnt[3]=0; Fill();
}
}
if(i==2){
ans+=cnt[2]/9;cnt[2]%=9;
if(cnt[2]){
ans++;
space[1]=4*(9-cnt[2]); cnt[2]=0;
Fill();
}
}
if(i==1&&cnt[1]){
ans+=(cnt[1]-1)/36+1;
}
memset(space,0,sizeof(space));
}
cout<<ans<<endl;
}
return 0;
}


《程序设计导引及在线实践》 李文新等中的代码

思路是先不管盒子中空余的小空间,先把大小6-3的物品装进去,然后装2的,最后利用面积算出当前所有的碎片空间,装1,装完后,如果还剩余大小为1的物体,再开辟新的盒子。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int cnt[10],space[10];
int util[4]={0,5,3,1};
int main(){
int a,b,c,d,e,f,x,y;
while(1){
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
if(a+b+c+d+e+f==0) break;
int ans=f+e+d+(c+3)/4;
y=d*5+util[c%4];
if(b>y) ans+=(b-y+8)/9;
x=36*ans-36*f-25*e-16*d-9*c-4*b;
if(a>x) ans+=(a-x+35)/36;
printf("%d\n",ans);
}
return 0;
}


后一个版本代码量少的原因有如下几点:

输入时避免循环

程序结构的设计

引入辅助数组util,去除循环
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: