UVA311:Packets(贪心)

题目大意:
有1*1,2*2,3*3,...六种小包裹,往6*6的箱子里装,给出六种小包裹各自的数量,求出最少用的箱子的个数。
贪心,思路还是比较简单的,先从大的开始往小的装。
6*6的包裹,每个单独装一个箱子;
5*5的包裹,可以和11个1*1的搭配;
4*4的包裹,可以喝5个2*2的搭配,如果2*2的不够,则补1*1的个数;
.
.
.
以此类推(注意3*3的有四种搭配方案)。
这里可以每次优先用2*2的去填,如果2*2的为负了,再用1*1的补正,这样可以简化过程。
最后如果1*1的数量为负,则不用处理(原因很简单,在此不赘余),若为正,则继续装。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
typedef long long  ll;
#define inf 0x3f3f3f3f
using namespace std;
int a,b,c,d,e,f;
ll sum;
int main()
{
    while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF)
    {
        sum=0;
        if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break;
        sum=sum+f+e;
        a=a-11*e;
        sum=sum+d;
        if(b-5*d>=0)
            b=b-5*d;
        else
        {
            a=a-4*(5*d-b);
            b=0;
        }
        if(c%4==0)
            sum=sum+c/4;
        else if(c!=0)
        {
            sum=sum+c/4+1;
            int te=c%4;
            if(te==1)
            {
                if(b>=5)
                {
                    b-=5;
                    a-=7;
                }
                else if(b==4)
                {
                    b-=4;
                    a-=11;
                }
                else if(b==3)
                {
                    b-=3;
                    a-=15;
                }
                else if(b==2)
                {
                    b-=2;
                    a-=19;
                }
                else if(b==1)
                {
                    b-=1;
                    a-=23;
                }
                else
                {
                    a-=27;
                }
            }
            else if(te==2)
            {
                if(b>=3)
                {
                    b-=3;
                    a-=6;
                }
                else if(b==2)
                {
                    b-=2;
                    a-=10;
                }
                else if(b==1)
                {
                    b-=1;
                    a-=14;
                }
                else
                {
                    a-=18;
                }
            }
            else if(te==3)
            {
                if(b>=1)
                {
                    b-=1;
                    a-=5;
                }
                else
                {
                    a-=9;
                }
            }
        }
        if(b>0)
        {
            while(b>=9)
            {
                sum+=1;
                b-=9;
            }
            if(b>0) sum+=1;
            a=a-(9-(b%9))*4;
            if(a>=0&&a%36==0)
                sum+=a/36;
            else if(a>0)
                sum+=a/36+1;
        }
        else
        {
            if(a>=0&&a%36==0)
                sum+=a/36;
            else if(a>0)
                sum+=a/36+1;
        }
        printf("%lld
",sum);

    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhangmingcheng/p/4271338.html