美文网首页
Openjudge noi 19 装箱问题

Openjudge noi 19 装箱问题

作者: 科学旅行者 | 来源:发表于2016-12-14 13:52 被阅读98次

题目:

描述
一个工厂制造的产品形状都是长方体,它们的高度都是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;
}

相关文章

  • Openjudge noi 19 装箱问题

    题目: 描述一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为11...

  • 12:最长平台

    http://noi.openjudge.cn/ch0109/12/[http://noi.openjudge.c...

  • 大整数加法

    题目地址:http://noi.openjudge.cn/ch0106/10/题目:总时间限制: 1000ms 内...

  • Openjudge noi 7620 区间合并

    题目: 总时间限制: 1000ms 内存限制: 65536kB描述给定 n 个闭区间 [ai; bi],其中i=1...

  • Openjudge noi 1768 最大子矩阵

    题目: 描述已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)...

  • 编程题#1: 棋盘问题

    编程题#1: 棋盘问题 来源: POJ[http://cxsjsxmooc.openjudge.cn/test2/...

  • 装箱问题

    问题 假设有编号分别为0、1、……、n-1的n种物品,体积分别为V0、V1、……、Vn-1。将这n种物品装到容量都...

  • 装箱问题

    贪心算法 装箱问题 问题描述: 求解思路: 代码实现:

  • 画家问题

    http://cxsjsxmooc.openjudge.cn/test/Y/ 代码

  • CCF NOI2019获奖规则

    CCF NOI科学委员会确定了NOI2019获奖规则,现公布如下: 1. NOI2019总获奖率为85% 奖牌分数...

网友评论

      本文标题:Openjudge noi 19 装箱问题

      本文链接:https://www.haomeiwen.com/subject/odpimttx.html