pku 1017 貪心

題目大意就是在一個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;

}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章