311 Packets

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 7
using namespace std;
int n;
int a[N];
int temp[5]= {0,1,3,5,9};
int l[3];
int main()
{
//    int t;
//    scanf("%d",&t);


    freopen("ex.in","r",stdin);

    while(1)
    {
        int cnt=0,ok=0;
        for(int i=1; i<7; i++)
        {
            scanf("%d",&a[i]);
            if(a[i]&&!ok)
                ok=1;
        }
        if(!ok)
            break;


        memset(l,0,sizeof(l));

        cnt+=a[6]+a[5]+a[4];
        l[1]=a[5]*11;
        l[2]=a[4]*5;

        cnt+=a[3]/4;
        a[3]%=4;
        if(a[3])
        {
            cnt++;
            l[2]+=temp[4-a[3]];//
            l[1]+=36-temp[4-a[3]]*4-a[3]*9;//
        }
        a[2]-=l[2];
        if(a[2]<0)
        {
            l[1]+=-a[2]*4;
        }
        if(a[2]>0)
        {
            cnt+=a[2]/9;
            a[2]%=9;
            if(a[2])
            {
                cnt++;
                l[1]+=36-a[2]*4;
            }
        }
        a[1]-=l[1];
        if(a[1]>0)
        {
            cnt+=a[1]/36;
            a[1]%=36;
            if(a[1])
                cnt++;
        }

        printf("%d\n",cnt);


    }
    return 0;
}


简单的贪心,按照从大到小放的原则~ 4*4,5*5,6*6的,一个盒子只能放一个,所以有多少个4*4,5*5,6*6就最少有这么多盒子,然后看3*3的,4个3*3的能放进一个盒子,用3*3出现的次数加上3除以4得到放3*3需要多少个盒子,这时候只剩下2*2, 1*1了,2*2能放到1个4*4里面5个,能放到一个3*3里面有4种情况:0,1,3,5.最后放1*1的,哪放得下放哪,实在放不下了就再增加盒子~ 比下边的方法好!!!!!!!!








#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 7
using namespace std;
int n;
int a[N];
int temp[5]= {0,1,3,5,9};
int main()
{
//    int t;
//    scanf("%d",&t);


//    freopen("ex.in","r",stdin);

    while(1)
    {
        int cnt=0,ok=0;
        for(int i=1; i<7; i++)
        {
            scanf("%d",&a[i]);
            if(a[i]&&!ok)
                ok=1;
        }
        if(!ok)
            break;


        cnt+=a[6]+a[5]+a[4];
        a[1]-=a[5]*11;
        a[2]-=a[4]*5;
        if(a[2]<0)
        {
            a[1]+=a[2]*4;
            a[2]=0;
        }
//        if(a[1]<0)
//        a[1]=0;

        cnt+=a[3]/4;
        a[3]%=4;
        if(a[3])
        {
            cnt++;
            int t=4-a[3];
            a[2]-=temp[t];//
            int num=0;
            if(a[2]<0)
            {
                num=-a[2];
                a[2]=0;
            }
            a[1]-=36-a[3]*9-temp[t]*4+num*4;
//            if(a[1]<0)
//            a[1]=0;
        }

        if(a[2]>0)
        {
            cnt+=a[2]/9;
            a[2]%=9;

            if(a[2])
            {
                cnt++;
                a[1]-=36-a[2]*4;
            }
        }


        if(a[1]>0)
        {
            cnt+=a[1]/36;
            a[1]%=36;
            if(a[1])
                cnt++;
        }
        printf("%d\n",cnt);


    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值