zoukankan      html  css  js  c++  java
  • poj1017

    一、题意:有底面积为1*1,2*2,...,6*6高为h的物品若干,求用最少的包装盒包装好这些物品,其中包装盒的大小固定为底面积6*6,高为h

    二、思路:贪心。先放大的,然后用小的尽量去凑满这个包装盒,从6到1类推。我用的是比较暴力的方法,每一种情况都考虑出来,然后模拟。

    三、代码:

    #include"iostream"
    #include"stdio.h"
    #include"math.h"
    using namespace std;
    
    int num[7];
    
    int Solve()
    {
        int res=num[5];
        res+=num[4];
        num[0]-=num[4]*11;
        res+=num[3];
        if(num[1]<num[3]*5)
        {
            num[0]-=(20*num[3]-4*num[1]);
        }
        num[1]-=num[3]*5;
        res+=num[2]/4;
        int numLeave=num[2]%4;
        if(numLeave>0) res++;
        switch(numLeave)
        {
        case 1:
            if(num[1]<5)
            {
                if(num[1]>0)
                {
                    num[0]-=(27-num[1]*4);
                    num[1]=0;
                }
                else
                    num[0]-=27;
    
            }
            else
            {
                num[1]-=5;
                num[0]-=7;
            }
            break;
        case 2:
            if(num[1]<3)
            {
                if(num[1]>0)
                {
                    num[1]=0;
                    num[0]-=(18-num[1]*4);
                }
                else
                    num[0]-=18;
            }
            else
            {
                num[1]-=3;
                num[0]-=6;
            }
            break;
        case 3:
            if(num[1]<1)
            {
                num[0]-=9;
            }
            else
            {
                num[1]-=1;
                num[0]-=5;
            }
            break;
        default:
            break;
        }
        if(num[1]>0)
        {
            res+=num[1]/9;
            if(num[1]%9>0)
            {
                res++;
                num[0]-=(36-4*(num[1]%9));
            }
        }
        if(num[0]>0)
        {
            res+=ceil(num[0]/36.0);
        }
        return res;
    }
    
    int main()
    {
        while(true)
        {
            int sum=0;
            for(int i=0;i<6;i++)
            {
                cin>>num[i];
                sum+=num[i];
            }
            if(!sum) break;
            cout<<Solve()<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    第一类斯特林数,第二类斯特林数,组合数
    P1005 矩阵取数游戏
    P4609 [FJOI2016]建筑师
    射击小游戏一03(碰撞检测)
    CCLabelAtlas 特效 自定义CCLabelTTF
    CCSpriteBatchNode cocos2dx使用
    cocos2dx plist动画
    CCSpriteBatchNode 渲染
    cocos2dx 实现翻牌效果
    cocos2dx技能冷却
  • 原文地址:https://www.cnblogs.com/acm-jing/p/9833172.html
Copyright © 2011-2022 走看看