poj-1017-Packets(贪心)

Packets
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 61190   Accepted: 20714

Description

A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These products are always delivered to customers in the square parcels of the same height h as the products have and of the size 6*6. Because of the expenses it is the interest of the factory as well as of the customer to minimize the number of parcels necessary to deliver the ordered products from the factory to the customer. A good program solving the problem of finding the minimal number of parcels necessary to deliver the given products according to an order would save a lot of money. You are asked to make such a program.

Input

The input file consists of several lines specifying orders. Each line specifies one order. Orders are described by six integers separated by one space representing successively the number of packets of individual size from the smallest size 1*1 to the biggest size 6*6. The end of the input file is indicated by the line containing six zeros.

Output

The output file contains one line for each line in the input file. This line contains the minimal number of parcels into which the order from the corresponding line of the input file can be packed. There is no line in the output file corresponding to the last ``null'' line of the input file.

Sample Input

0 0 4 0 0 1 
7 5 1 0 0 0 
0 0 0 0 0 0 

Sample Output

2 
1 

题意:公司有1*1, 2*2, 3*3, 4*4, 5*5, 6*6.尺寸的产品高度同为h,要用6*6高为h的箱子打包,问需要的最少箱子个数

思路:先放大的6*6 5*5 4*4 都需要新开箱子 每4个3*3需要开个新箱子  算下剩多少2*2和1*1的  如果不够再开箱子如果一个箱子中放置了一个6*6的产品,则此箱子中无法放置其它产品;

若放置一个5*5的产品,则此箱子中还可放置11个1*1的产品;

若放4*4的产品,还可放5个2*2的产品。

若放置3*3的产品,可以放置4个、3个、2个、1个,剩余的空位分别对应可以放置0个1*1,0个2*2; 5个1*1,1个2*2; 6个1*1,3个2*2; 7个1*1,5个2*2;
若放2*2产品,可放9个;
若放1*1产品,可放36个
#include <iostream>
using namespace std;
int main()
{
    int a,b,c,d,e,f;
    int s,s3,s4,s5;
    while(cin>>a>>b>>c>>d>>e>>f && a+b+c+d+e+f)
    {
        //(b3+3)/4 正好等于b3除以4向上取整的结果
        int cnt = ((c+3)/4) + d + e + f;
        int x = 0;
        //x记录被3*3的占用之后,还剩多少给2*2的使用  
        if(c%4 == 1) x = 5;
        if(c%4 == 2) x = 3;
        if(c%4 == 3) x = 1;
        int x2 = d*5 + x; //x2记录当前能放 2*2 产品的数目
        //放一个4*4的剩余面积是36-16为20,20/4为5
        //也就是放一个4*4的需要5个2*2的刚好装满
        //d个4*4,也就是d*5个2*2了
        if(x2 < b) cnt += (b - x2 + 8) / 9; 
        //向上调整计算剩余2*2的产品还可以放几个箱子
        int x1 = cnt*36-f*36-e*25-d*16-c*9-b*4; 
        //x1记录当前能放 1*1产品的空格数目,因为1*1百搭,直接计算就好了
        if(x1 < a) cnt += (a - x1 + 35) / 36;
        //向上调整计算剩余1*1的产品还可以放几个箱子
        cout << cnt << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/80974070