pku 1017 贪心

来源:互联网 发布:日语翻译软件那个最好 编辑:程序博客网 时间:2024/05/05 05:59

题目大意就是在一个6*6的盒子里,放一些不同大小的方片  1*1、2*2、......6*6

求把所有方片放下所需盒子的最小数量

 

用sum记录

对于6*6的方片,必须得用一个盒子  sum+=num[6];

 

对于5*5的方片,首先必须用一个盒子才能将其装下,所以sum+=num[5];剩下的空间只能装1*1的方片了,所以判断num[1]与11的大小,

num[1]>11?num[1]-=11:num[1]=0;

 

4*4的方片,也需占用一个盒子——sum+=num[4],剩下的空间可以装下5个2*2的方片,于是首先用2*2的方片来填,2*2的不够了,再用1*1的来填

 

3*3的方片,一个盒子可以装下四个, 所以sum+=num[3]%4?num[3]/4+1:num[3]/4;

3*3的方片没装满的情况分类讨论了:  对于只装了1个3*3方片的盒子  还能放下5个2*2的方片及7个1*1的方片

                                                     对于只装了2个3*3方片的盒子  还能放下3个2*2的方片及6个1*1的方片

                                                     对于只装了3个3*3方片的盒子  还能放下1个2*2的方片及5个1*1的方片

 

至于2*2的方片和1*1的方片就比较简单了

 

我的代码:

 

 

#include <iostream>

#include <map>

#include <stdio.h>

#include <algorithm>

#include <cstring>

 

using namespace std;

 

int num[7];

 

int main()

{

 

    while (1)

    {

        int i(1);

        while (i<=6)

            cin>>num[i++];

        bool pan(0);

        i=1;

        while (i<=6)

        {

            if (num[i])

            {

                pan=1;

                break;

            }

 

            ++i;

        }

        if (!pan) break;

 

        int sum(0);

        int sub;

        sum+=num[6];

 

        sum+=num[5];

 

        sub=num[5]*11;

 

        if (num[1]>=sub) num[1]-=sub;

        else num[1]=0;

 

        sum+=num[4];

 

        sub=5*num[4];

 

        if (num[2]>=sub) num[2]-=sub,sub=0;

        else

        {

            sub-=num[2];

            num[2]=0;

        }

        sub*=4;

        if (num[1]>=sub) num[1]-=sub;

        else num[1]=0;

        if (num[3]%4==0)

            sum+=num[3]/4;

        else

        {

            sum+=num[3]/4+1;

 

            sub=num[3]%4;

            num[1]-=8-sub;

            sub=7-2*sub;

            if (num[2]>=sub) num[2]-=sub,sub=0;

            else

            {

                sub-=num[2];

                num[2]=0;

            }

            sub*=4;

            if (num[1]>=sub) num[1]-=sub;

            else num[1]=0;

        }

        if (num[2]%9)

           { sum+=num[2]/9+1;

 

 

        num[2]%=9;

 

        sub=36-4*num[2];

 

        if (num[1]>=sub) num[1]-=sub;

        else num[1]=0;

           }

           else sum+=num[2]/9;

        if (num[1]%36)

            sum+=num[1]/36+1;

        else sum+=num[1]/36;

        cout<<sum<<endl;

 

    }

    return 0;

}

 

 

 

 

 

原创粉丝点击