poj1017 Packets贪心

一家工厂生产的产品规格分为1×1, 2×2, 3×3, 4×4, 5×5, 6×6,高都是h。工厂要把它们包在6×6×h的包装袋中。工厂想让包装数尽可能少。
Input
多组数据。每一行为一组数据。依次是1×1, 2×2, 3×3, 4×4, 5×5, 6×6的产品的个数。 输入数据由6个0结束。
Output
对于每组数据,输出包装所有产品所需最少包装袋数量
Sample Input
0 0 4 0 0 1 
7 5 1 0 0 0 
0 0 1 0 1 0
0 0 0 0 0 0 
Sample Output
2 
1
2 

这题写的超级难受,开始没有具体去分析题目,写了个很多循环的版本,错了

调了好久的问题,感觉使用循环比较复杂

错误的版本:

#include<iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
    ll s[10];
    while(cin>>s[1]>>s[2]>>s[3]>>s[4]>>s[5]>>s[6]){
        if(!s[1]&&!s[2]&&!s[3]&&!s[4]&&!s[5]&&!s[6])break;
        ll ans=0;
        for(ll i=6;i>=1;i--){
            while(s[i]){
                s[i]--;
                ll sum=i*i;
                for(ll j=min(6-i,i);j>=1;j--){
                    while(sum+j*j<=36&&s[j]>0){


                        s[j]--;
                        sum+=j*j;
                        //我忽略了边长为3的情况,当有一个,边长为2的只能填充5个
                        //                           两个,                 3
                        //                           三个                   1
                    }
                }
                ans++;
            }
        }
//        cout<<s[1]<<" "<<s[2]<<" "<<s[3]<<" "<<s[4]<<" "<<s[5]<<" "<<s[6]<<endl;
        cout<<ans<<endl;
    }
    return 0;
}
所以我们需要特殊判断为3的情况

#include<iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
int main()
{
    int s1,s2,s3,s4,s5,s6;
    while(cin>>s1>>s2>>s3>>s4>>s5>>s6&&s1+s2+s3+s4+s5+s6){
        int ans=0;
        ans+=s6;
        ans+=s5;
        s1=max(0,s1-11*s5);
        ans+=s4;
        if(s2<5*s4)s1=max(0,s1-(5*s4-s2));
        s2=max(0,s2-5*s4);
        ans+=(s3+3)/4;
        s3%=4;
        if(s3==1){
            if(s2<5) s1 = max(0, s1-(27-4*s2));
            else     s1 = max(0, s1-7);
            s2 = max(0, s2-5);
        }
        else if(s3==2){
            if(s2<3) s1 = max(0, s1-(18-4*s2));
            else     s1 = max(0, s1-6);
            s2 = max(0, s2-3);
        }
        else if(s3==3){
            if(s2<1) s1 = max(0, s1-(9-4*s2));
            else     s1 = max(0, s1-5);
            s2 = max(0, s2-1);
        }
        ans+=(s2+8)/9;
        s2%=9;
        if(s2)s1=max(0,s1-(36-4*s2));
        ans+=(s1+35)/36;
        cout<<ans<<endl;
    }
    return 0;
}
这样应该是对的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值