poj1017

题目描述:有六种size(1*1,2*2,3*3,4*4,5*5,6*6,)的物品,只有一种size(6*6)的箱子。现给出每种物品的数量,求最少要用多少个箱子才能装下所有的物品。
输入格式:有多组数据,每组数据一行,每行六个整数,分别表示从1*1到6*6size的物品的数量。输入以6个零结束。
输出格式:每组数据输出一行,每行一个整数,表示最少的箱子数量。最后六个零不输出。
解题思路:特么的就一道贪心水题。。结果我特么WA了四次。。不得不说是天坑。感觉自己好渣渣。在讨论区看到一个漂亮的算法。
首先:6*6、5*5、4*4的肯定每个物品要占用一个箱子。
其次:每四个3*3的物品要占用1个箱子。
然后:根据上面的数量算出此时要用的箱子数和这些箱子放下上面的四种物品之后还剩下的空间里能放下的2*2的物品数量,然后判断能放下的2*2物品的数量和需要放的2*2的数量的关系,如果放不下,增加箱子数量。
最后:由于此时所有箱子的所有空间一定可以放下2*2到6*6的所有物品,所以计算放完2*2到6*6的所有物品之后箱子还剩下的1*1空间数量,与1*1物品的数量比较,如果不能放得下,增加箱子的数量。

我的代码:

#include <cstdio>
int main(int argc, char const *argv[])
{
    const int u[4]={0,5,3,1};
    int a, b, c, d, e, f, rem, ans;
    while(scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f)) {
        if(!a && !b && !c && !d && !d && !e && !f) { break; }
        ans = f+e+d+(c+3)/4;
        rem = d*5+u[c%4];
        b>rem?ans+=(b-rem+8)/9:0;
        rem = (ans-f)*36-e*25-d*16-c*9-b*4;
        a>rem?ans+=(a-rem+35)/36:0;
        printf("%d\n", ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值