POJ P1707 摘选自 ζёСяêτ - 小優YoU 大佬的题解#1

POJ P1017 Question Report
Packets
时间限制: 1000毫
内存限制: 10000 k
有道翻译 (垃圾翻译不如去看题解)
描述(机翻忒辣鸡)
工厂生产的产品装在方形包的 同一高度(h)和大小的1 * 1,2 * 2,3 * 3,4 * 4,5 * 5,6 * 6。广场上的这些产品总是交付给客户的包裹一样高(h)的产品和尺寸6 * 6。因为费用是工厂的利益以及客户的包裹需要交付的数量 降到最低订购了产品从工厂到客户。一个好的程序解决问题 找到所需的最小数量的包裹交付给产品根据订单会省下一大笔钱。你被要求做这样的一个程序。
输入
输入文件包含几行指定命令。每一行指定一个秩序。订单被 六个整数隔开一个空格代表先后个体大小的数据包的数量从 最小的尺寸1 * 1的最大尺寸6 * 6。输入文件的结束由线表示包含六个零。
输出
输出文件包含一行输入文件中的每一行。这一行包含订单的最小数量的包裹从相应的输入文件可以包装。 没有线相对应的输出文件的最后一个“零”行输入文件
样例输入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出
2
1
代码: 标程
//POJ1017 pjQ1
//贪心(思想) 暴力,枚举 穷举
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
        int a1,a2,a3,a4,a5,a6; //6种size的盒子数量
        while(1==1){
        scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6);
                if(a1==0 && a2==0 && a3==0 && a4==0 && a5==0 && a6==0){
                break;
              }
        int PackNum=0; //放进所有盒子所需的最少箱子数
        PackNum+=a6; //6*6的盒子,每个都刚好独占一个箱子
        //=============
        PackNum+=a5; //5*5的盒子,放进箱子后,每个箱子余下的空间只能放11个1*1的盒子
        a1=max(0,a1-a5*11); //把1*1的盒子尽可能地放进已放有一个5*5盒子的箱子
        //=============
        PackNum+=a4;             //4*4的盒子,放进箱子后,每个箱子余下的空间为5个2*2的盒子空间
            if(a2>=a4*5){              //先把所有2*2的盒子尽可能地放进这些空间 若2*2的盒子数比空间多
            a2-=a4*5;  //则消去已放进空间的部分
          }
        else                                  //若2*2的盒子数比空间少
        {      //则先把所有2*2的盒子放进这些空间
            a1=max(0,a1-4*(a4*5-a2)); //再用1*1的盒子填充本应放2*2盒子的空间
            a2=0; //一个2*2空间可放4个1*1盒子
        }
        //=============
        PackNum+=(a3+3)/4; //每4个3*3的盒子完全独占一个箱子
        a3%=4; //3*3的盒子不足4个时,都放入一个箱子,剩余空间先放2*2,再放1*1
        if(a3){
            if(a2>=7-2*a3){ //当箱子放了i个3*3盒子,剩下的空间最多放j个2*2盒子
        a2-=7-2*a3; //其中i={1,2,3} ; j={5,3,1} 由此可得到条件的关系式
        a1=max(0,a1-(8-a3)); //当箱子放了i个3*3盒子,并尽可能多地放了个2*2盒子后
            } //剩下的空间最多放j个1*1盒子,其中i={1,2,3} ; j={7,6,5}
        else //但当2*2的盒子数不足时,尽可能把1*1盒子放入剩余空间
        { //一个箱子最多放36个1*1,一个3*3盒子空间最多放9个1*1,一个2*2盒子空间最多放4个1*1
        a1=max(0,a1-(36-9*a3-4*a2)); //由此很容易推出剩余空间能放多少个1*1
        a2=0;
        }
    }
         //==============
        PackNum+=(a2+8)/9; //每9个2*2的盒子完全独占一个箱子
        a2%=9; //2*2的盒子不足9个时,都放入一个箱子,剩余空间全放1*1
            if(a2){
            a1=max(0,a1-(36-a2*4));
           }
        //==============
        PackNum+=(a1+35)/36; //每36个1*1的盒子完全独占一个箱子
        printf("%d\n",PackNum);
  }
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42570306/article/details/80849744
今日推荐