poj 1017 && uva 311 && la 5526

题目概述

有6种底面为正方形的箱子,底面边长分别为1到6,要用底面为边长6的正方形的盒子去装这些箱子,最少要多少个盒子
箱子不能堆叠

时限

1000ms/3000ms

输入

每行6个整数,为每种箱子数量,按边长升序给出,输入到6个0为止

限制

没有限制

输出

每行一个数,为最少盒子数

样例输入

0 0 4 0 0 1
7 5 1 0 0 0
36 9 4 1 1 1
0 9 4 1 1 0
0 0 4 0 0 0
36 0 0 0 0 0
0 9 0 0 0 0
79 96 94 30 18 14
53 17 12 98 76 54
83 44 47 42 80 3
15 26 13 29 42 40
41 61 36 90 54 66
78 56 445 45 23 65
13 4 8 29 45 3
15 75 45 98 34 53
40 9 0 2 0 0
41 9 0 2 0 0
44 0 0 0 4 0
0 2 3 0 0 0
37 7 2 0 1 0
12 2 0 1 0 0
13 2 0 1 0 0
0 0 0 0 0 0

样例输出

2
1
6
4
1
1
1
86
231
137
115
219
245
79
197
3
4
4
2
3
1
2

讨论

贪心,很容易想到的是,先放大的,然后用小的填空,具体一点的说,边长6的自然是独占一个,边长5的每个盒子最多塞一个,因而有多少就要加多少盒子,同时每次会产生11个放边长1的空,边长4的也是之多塞一个,产生的空可以放5个边长2,如果边长2够填满所有的空,直接填,否则不够的还得用边长1来填,边长3比较特殊,4个才占一个盒子,模4后为不满一个盒子的部分,剩下的空无法单凭边长2或边长1填满,但是可以发现规律,剩1个时,可再放5个边长2,7个边长1,剩2个,3个2,6个1,剩1个,1个2,5个1,规律就是,对于边长2,最多能塞72n3 个,边长1最多塞8n3 个,当边长2不够时,用面积计算需要多少个边长1,至于边长2和边长1,都折算为边长1的,按面积算需要多少
其实这个题暴力也能过……

题解状态

164K,0MS,C++,1013B

题解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1004
#define memset0(a) memset(a,0,sizeof(a))

int nums[7];
int fun()
{
    int cnt = 0;
    cnt += nums[6];//边长6
    cnt += nums[5];//边长5
    nums[1] -= min(nums[1], nums[5] * 11);
    cnt += nums[4];//边长4
    if (nums[2] >= nums[4] * 5)
        nums[2] -= nums[4] * 5;
    else {
        nums[1] -= min(nums[1], (nums[4] * 5 - nums[2]) * 4);
        nums[2] = 0;
    }
    cnt += (nums[3] + 3) / 4;//边长3
    if (nums[3] %= 4) {
        if (nums[2] >= 7 - 2 * nums[3]) {
            nums[2] -= 7 - 2 * nums[3];
            nums[1] -= min(nums[1], 8 - nums[3]);
        }
        else {
            nums[1] -= min(nums[1], 36 - 9 * nums[3] - 4 * nums[2]);
            nums[2] = 0;
        }
    }
    cnt += (nums[2] * 4 + nums[1] + 35) / 36;//边长2和边长1
    return cnt;
}
int main(void)
{
    //freopen("vs_cin.txt", "r", stdin);
    //freopen("vs_cout.txt", "w", stdout);

    while (~scanf("%d%d%d%d%d%d", &nums[1], &nums[2], &nums[3], &nums[4], &nums[5], &nums[6]) && (nums[1] + nums[2] + nums[3] + nums[4] + nums[5] + nums[6]))//input
        printf("%d\n", fun());//output
}

EOF

发布了208 篇原创文章 · 获赞 2 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章