1. 程式人生 > >POJ - 1017 貪心

POJ - 1017 貪心

這個題不難,關鍵是濾清思路,明確怎麼放是最大利用空間的。

還有POJ不曉得為啥子,炸了好幾天,這道題隔了好久才交上。

思路:

6*6:一個就要獨佔一個箱子

5*5:一個要獨佔一個箱子,放完後還可以再放11個1*1

4*4:一個要獨佔一個箱子,放完後可以再放5個2*2(先緊著大的放),然後如有空餘再用1*1填補

3*3:這個比較麻煩,要把情況分開考慮(看我程式碼裡分的情況)

2*2和1*1和上面思路一樣;

 

程式碼寫的不是很簡潔,大家湊合看吧,反正是ac了;

#include <iostream>

using namespace std;

int a[7];

int main()
{
    while (!cin.eof())
    {
        int sum = 0;
        for (int i = 1; i <= 6; i++) {cin >> a[i]; sum += a[i];}

        if (!sum) break;

        int ans = 0;
        if (a[6]) ans += a[6];
        if (a[5])
        {
            ans += a[5];

            int area = a[5] * 11;

            a[1] = (a[1] - area) <= 0 ? 0 : (a[1] - area);
        }
        if (a[4])
        {
            ans += a[4];
            int area = 20 * a[4];
            if (a[2])
            {
                if (area - a[2] * 4 <= 0)
                {
                    a[2] -= (area / 4);
                    area = 0;
                }
                else
                {
                    area -= a[2] * 4;
                    a[2] = 0;
                }

            }

            if (area && a[1])
            {
                if (area - a[1] <= 0) a[1] -= area;
                else a[1] = 0;
            }
        }

        if (a[3])
        {
            ans += (a[3] / 4);
            a[3] %= 4;        //3*3還剩下一部分
            if (a[3]) {
                int area = 36 - (9 * a[3]);
                ans += 1;

                if (a[3] == 1)
                {
                    area = 27;
                    if (a[2])
                    {
                        if (a[2] <= 5)
                        {
                            area -= (4 * a[2]);
                            a[2] = 0;
                        }
                        else
                        {
                            area -= 20;
                            a[2] -= 5;
                        }
                    }

                    if (area)
                    {
                        if (a[1])
                        {
                            if (a[1] <= area) a[1] = 0;
                            else a[1] -= area;
                        }
                    }
                }
                else if (a[3] == 2)
                {
                    area = 18;
                    if (a[2])
                    {
                        if (a[2] <= 3)
                        {
                            area -= (4 * a[2]);
                            a[2] = 0;
                        }
                        else
                        {
                            area -= 12;
                            a[2] -= 3;
                        }
                    }

                    if (area)
                    {
                        if (a[1] >= area) a[1] -= area;
                        else a[1] = 0;
                    }

                }
                else if (a[3] == 3)
                {
                    if (a[2])
                    {
                        a[2] -= 1;

                        if (a[1])
                        {
                            if (a[1] <= 5) a[1] = 0;
                            else a[1] -= 5;
                        }
                    }
                    else
                    {
                        if (a[1])
                        {
                            if (a[1] <= 9) a[1] = 0;
                            else a[1] -= 9;
                        }
                    }

                }
            }
        }


        if (a[2])
        {
            ans += (a[2] / 9);
            a[2] %= 9;


            if (a[2])
            {
                int area = 36 - (4 * a[2]);

                a[1] = (a[1] - area <= 0) ? 0 : (a[1] - area);

                ans++;

            }
        }

        if (a[1])
        {
            ans += (a[1] % 36 == 0) ? (a[1] / 36) : (a[1] / 36) + 1;
        }

        cout << ans << endl;

    }
    return 0;
}