POJ 1017

题目链接:http://poj.org/problem?id=1017

 

读题用了好久,英语真的没底子可以混了,最后还是搜的题意:

 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个 
型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6.  这些产品通常使用一个  6*6*h       

的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的 
包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由 
你来设计。  
    输入数据  
    输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空 
格隔开,分别为 1*1 至6*6 这六种产品的数量。输入文件将以 6 个0 组成的一行结尾。  
    输出要求  
    除了输入的最后一行6 个0 以外,输入文件里每一行对应着输出文件的一行,每一行输 
出一个整数代表对应的订单所需的最小包裹数。  

 

解题思路:

因为高度都是h,则无需考虑,只考虑底面积大小就可以。6*6的箱子,对于6*6,5*5,4*4,3*3的,只能放自己或尺寸比自己小的;所以先放大的,再用小的填空,

//6*6一个,

//5*5一个+11个1*1

//4*4一个+5个2*2

//3*3四个,或3个3*3+1个2*2,或2个3*3+3个2*2,或1个3*3+5个2*2,

 

 

提示:这里原本用的math.h中的ceil函数,结果wa了,不知道为什么……,要么自定义,要么加一个数再做除法……

以后遇到max这类不识别的问题的话,也可以考虑自定义……(一个小白的自我陈述)

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
//6*6一个,5*5一个+11个1*1
//4*4一个+5个2*2;
//3*3四个 
int main()
{
    int a,b,c,d,e,f,N;//N存放盒子个数
     while(~scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f)) 
    {
        if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
            break;
        int u[4]={0,5,3,1};
        //3*3的产品数目分别是4的倍数,4的倍数加1,4的倍数加2,加3剩余空间所能存放的2*2的个数
        N=d+e+f+(c+3)/4; //先放只能放自己或比自己小的在一个盒子里
        //然后计算剩余空间可以放多少个2*2
        int y=d*5+u[c%4];
        if(b>y) N+=ceil(b-y+8)/9; 
        //计算1*1的
        int x=N*36-b*4-c*9-d*16-e*25-f*36;
        if(a>x) N+=(a-x+35)/36;
        printf("%d\n",N);
    }
    return 0;
 } 

 

posted @ 2018-04-10 00:22  星海violet  阅读(299)  评论(0编辑  收藏  举报