POJ 1017: Packets

来源:互联网 发布:matlab怎么编程 编辑:程序博客网 时间:2024/05/16 19:03

解题要点: 想出最优化的装箱方法.
装箱次序如下:

  1. 装 6x6 的: 一箱 1 个, 无盈余.
  2. 装 5x5 的: 一箱 1 个, 剩余空间可以装 1x1 的.
  3. 装 4x4 的: 一箱 1 个, 剩余空间可装 5 个 2x2 的, 若装不满, 还可以继续装 1x1 的.
  4. 装 3x3 的: 一箱最多 4 个, 若装不满, 则:
    • 装了 1 个 3x3 的: 还可以装 5 个 2x2 的, 剩余空间可以装 1x1 的.
    • 装了 2 个 3x3 的: 还可以装 3 个 2x2 的, 剩余空间可以装 1x1 的.
    • 装了 3 个 3x3 的: 还可以装 1 个 2x2 的, 剩余空间可以装 1x1 的.
  5. 装 2x2 的: 先填满之前的空余空间. 若还有剩余, 则一箱最多装 9 个. 若装不满, 还可以继续装 1x1 的.
  6. 装 1x1 的: 先填满之前的空余空间. 若还有剩余, 则一箱最多装 36 个.

总结一下, 确定所需箱子数目的过程可大致分为两步:

  1. 根据 6x6, 5x5, 4x4, 3x3 的数目, 确定箱子的大致数目.
  2. 依次用 2x2 及 1x1 进行填充, 若空间不足则继续加箱.

代码如下:

#include <iostream>using namespace std;int main() {    int a, b, c, d, e, f;    int twoInThree[] = {0, 5, 3, 1};    while( cin >> a >> b >> c >> d >> e >> f            && ( a != 0 || b != 0 || c != 0 || d != 0 || e != 0 || f != 0 )            ) {        int n = f + e + d + ( c + 3 ) / 4;        int tmp = d * 5 + twoInThree[c % 4];        if( b > tmp ) {            n += ( b - tmp + 8 ) / 9;        }        tmp = ( n - f ) * 36 - e * 25 - d * 16 - c * 9 - b * 4;        if( a > tmp ) {            n += ( a - tmp + 35 ) / 36;        }        cout << n << endl;    }}
0 0
原创粉丝点击