Openjudge noi 19 装箱问题

题目:

描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为11, 22, 33, 44, 55, 66。这些产品通常使用一个 66h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为11至66这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
样例输入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出
2
1

参考代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 6;

int a[N];

void init() {
    memset(a, 0, sizeof(a));
}

int numofboxes() {
    int box = 0;//一共要装产品的盒子的个数;
    box += a[5];//6*6*h的产品每个都需要装满一个盒子;
    box += a[4];//5*5*h的产品, 每个产品装一个盒子, 之后会产生11个空格, 但空格仅满足放1*1*h的产品;
    a[0] = max(0, a[0] - a[4] * 11);//1*1*h的产品可能不够, 也可能有剩余, 剩余的话则之前装5*5*h的盒子都已经填满;//之后a[0]表示剩余的1*1*h的产品数;
    box += a[3];//填充4*4*h的产品;
    if (a[1] >= a[3] * 5) {//一个4*4*h的产品装入后还剩5个2*2*h的空间;//a[3] * 5表明一共有含有4*4*h的盒子的数目中的空余格子, 每个盒子都可以最多装5个2*2*h的产品;
        a[1] -= a[3] * 5;//填充2*2*h的产品;  
    }
    else {//2*2*h的产品不够;
        a[0] = max(0, a[0] - 4 * (a[3] * 5 - a[1]));//再用1*1*h的产品填充本应放2*2*h的产品的空间;
        a[1] = 0;//一个2*2空间可放4个1*1*h的产品;
    }
    box += (a[2] + 3) / 4;//每4个3*3*h的产品独占一个盒子;//此时一个产品不足以单独占一个盒子;
    a[2] = a[2] % 4;//余下的3*3*h的产品数;
    if (a[2]) {//有剩余的3*3*h的产品;
        if (a[1] >= 7 - 2 * a[2]) {//2*2*h的产品还有剩余;//1个盒子内可放1个3*3*h的产品加5个2*2*h的产品加7个1*1*h的产品;
            a[1] = a[1] - (7 - 2 * a[2]);
            a[0] = max(0, a[0] - (8 - a[2]));
        }   
        else {//2*2*h的产品没有剩余;
            a[0] = max(0, a[0] - (36 - 9 * a[2] - 4 * a[1]));//一个盒子中除去3*3*h的产品和2*2*h的产品的位置, 剩下的位置就是装1*1*h的产品的位置;
            a[1] = 0;
        }
    }
    box += ((a[1] + 8) / 9);//如果还有剩余的2*2*h的产品, 则添加;//一个盒子最多可以装9个2*2*h的产品;
    a[1] = a[1] % 9;//剩余的2*2*h的产品数目;
    if (a[1]) {//如果还有剩余的2*2*h的产品;
        a[0] = max(0, a[0] - (36 - 4 * a[1]));//一个2*2*h的产品可占4个格子;
    }
    box += (a[0] + 35) / 36;//一个盒子最多可以放36个1*1*h的产品;
    return box;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    while (cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5]) {
        if (a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0 && a[5] == 0) {
            break;  
        }
        int ans = numofboxes();
        cout << ans << endl;    
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,...
    bbqub阅读 3,332评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,380评论 19 139
  • 问题描述 一个工厂制造的产品形状都是长方体,它们的高度都是 h,长和宽都相等,一共有六个 他们的长宽分别为 1...
    指尖极光阅读 3,008评论 0 0
  • Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加...
    bbqub阅读 3,996评论 0 0
  • 01 三月对我来说是被自己忽悠过去的一个月,工作上发生了些变化,却没多大进展,而且总在以“需要时间,慢慢来”为借口...
    王阿萌阅读 3,795评论 0 0