poj 1017 packets (贪心)

来源:互联网 发布:服务器定时重启软件 编辑:程序博客网 时间:2024/05/06 09:21

装箱问题  

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

的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的
包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由
你来设计。 
    输入数据 
    输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空
格隔开,分别为 1*1 至6*6 这六种产品的数量。输入文件将以 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>using namespace std;int num_2[] = {0,5,3,1};int num_1[] = {0,7,6,5};int main(){int a[7],ans,flag;while(1){flag=1;ans=0;for(int i=1;i<=6;i++){cin>>a[i];if(a[i]!=0)flag=0;}if(flag)break;ans=a[6]+a[5]+a[4]+(a[3]+3)/4;//4 5 6 尺寸的每个都要新开箱子/*将新开的箱子尽量填满*/ int a2 = a[4]*5 + num_2[a[3]%4];//尽量填满3 4 所需要2箱子的个数int a1 = a[5]*11 + num_1[a[3]%4];//填完2填1 if(a[2]>a2)//有剩余新开箱子{ ans+=(a[2]-a2+8)/9;//9 个2*2箱子可以填满一个6*6箱子,不足9个算一个a1+= 36-((a[2]-a2)%9)*4;//将新开的箱子用1*1填} else  //没有或者不够:2 不用新开箱子,不够的用1来填 { a1+=(a2-a[2])*4;} if(a[1]>a1)ans+=(a[1]-a1+35)/36;//除以36 向上取整,不足36个也新开一个 cout<<ans<<endl;}} 

0 0
原创粉丝点击