bnuoj_4057 魔方系列——最小装箱

来源:互联网 发布:如何做股票数据回测 编辑:程序博客网 时间:2024/05/08 20:18
reamFox为了发展地大的魔方水平,经常会到世界盲拧记录保持者瓦西里处去进货一些魔方。进货的魔方一共有6种,分别是1*1, 2*2, 3*3, 4*4, 5*5, 6*6.(当然魔方是立体的,但为了问题简化我们就只看平面吧,即假设所有魔方的高度和箱子一样高)。而且瓦西里前辈为了减少麻烦,只提供一种6*6大小的箱子。就是无论你买多少魔方,全部都得装到这种6*6的箱子里。 

现在问题来了,DreamFox发现,如果有效的放置魔方的位置,就可以使需要的箱子尽可能的少。但是如何让箱子最少呢?DreamFox这个人比较懒,所以请你编写一个程序计算需要箱子的最小值。 

intput:

第1行:N,有N组数据(N < 300)。 
第2..N+1行:有6个数,分别代表1*1, 2*2, 3*3, 4*4, 5*5, 6*6的魔方的个数。

output:

N行:每组数据的最小箱子数

sample:

20 0 4 0 0 1 7 5 1 0 0 0 
21
//平面填充#include<stdio.h>  int main(){    int a[7],s1,s,n,i,x1,x2;    scanf("%d",&n);    while(n--){        for(i=1;i<=6;i++)          scanf("%d",&a[i]);         s=0;        s+=a[6]+a[5]+a[4]+a[3]/4;//在只考虑填边长6,5,4,3时需的最少6*6方格数           if(a[3]%4>0) s+=1;    x2=a[6]*0+a[5]*0+a[4]*5;      if(a[3]%4==1) {x2+=5;s1=36-20-9;} // 在只有一个3边长的方格里最多放5个2边长 4*5=20 1*3*3=9       if(a[3]%4==2) {x2+=3;s1=36-12-18;}// 这个最多放3个 3*4=12 2*3*3=18       if(a[3]%4==3) {x2+=1;s1=36-4-27;} //s1是剩余面积也是能还能填1边长的数目        x1=a[6]*0+a[5]*11+a[4]*0+s1;   //在只考虑6,5,4,3的最小方格数情况下组合填(因为有空隙)1,2边长时(最优数目)=x1(需1边长数)+x2(需2边长数);    if(a[2]>=x2) { //在真实的条件情况下:调整箱子数。        a[2]-=x2;         if(a[1]>=x1) a[1]-=x1; else a[1]=0;        s+=(a[1]+a[2]*4)/36;        if((a[1]+a[2]*4)%36>0) s+=1;       }      else if(a[2]<x2){          x2-=a[2];          x1+=x2*4;  //1个当4个 x2->x1          a[1]-=x1;          if(a[1]>0) s+=a[1]/36;  //方格的面积:36          if(a[1]%36>0) s+=1;          }          printf("%d\n",s);    }return 0;}


0 0
原创粉丝点击