• 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;
    }
  • 相关阅读:
    2016-09-13面试记录
    javascript中的深度拷贝的实现过程及深拷贝的几种方法。
    javascript中的for in循环
    常见的兼容问题及其解决方法。
    一次清空所有数据方法
    数组排序
    css对齐 挖坑~
    css reset样式重置
    CSS 表单
    CSS 表格
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4271338.html
Copyright © 2020-2023  润新知