poj bailian 1017装箱问题

没有对比,没有伤害!


我的代码
思路是贪心的思想,从大往小装,将盒子中剩余的空间,装小的。
每新增加一个盒子,就从大往小遍历一遍,尽可能装。

#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,去除循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值