UVA 311 Packets

UVA_311

这个题目可以直接模拟装箱的过程,并且要先装大的。

①每个6*6的都占一个箱子。

②每个5*5的放在一个箱子里,同时里面还能装111*1的。

③每个4*4的放在一个箱子里,同时里面还能装52*2的,如果2*2的不够了,那么还能放1*1的。

④每43*3的放在一个箱子里,如果还剩余3*3的,则要看剩余的数目分别进行讨论。

⑤最后如果还剩下了2*21*1的,再装这些。

    同时,在装2*21*1都可以的情况下,我们优先装2*2。这里还有一个小技巧,就是我们可以假设2*2是充足的,万一到最后2*2成了负数,我们用1*1去补就可以了,这样就不用考虑2*2是否不够的问题了。所以比如在装4*4的时候,我们完全可以假设都能装下52*2的,最后再根据2*2的正负再确定最后还剩余多少2*21*1的,同样的,装5*5的时候也可以假设每个都能装下111*1的,装3*3的时候也是类似的。

#include<stdio.h>
#include<string.h>
int a[10];
int main()
{
int i,j,k,n;
while(1)
{
for(i=1;i<=6;i++)
scanf("%d",&a[i]);
if(!a[1]&&!a[2]&&!a[3]&&!a[4]&&!a[5]&&!a[6])
break;
n=0;
n+=a[6];
n+=a[5];
a[1]-=11*a[5];
n+=a[4];
a[2]-=5*a[4];
n+=a[3]/4;
if(a[3]%4==1)
{
a[2]-=5;
a[1]-=7;
n++;
}
else if(a[3]%4==2)
{
a[2]-=3;
a[1]-=6;
n++;
}
else if(a[3]%4==3)
{
a[2]-=1;
a[1]-=5;
n++;
}
if(a[2]<0)
{
a[1]+=4*a[2];
a[2]=0;
}
if(a[1]<0)
a[1]=0;
n+=(a[1]+4*a[2])/36;
if((a[1]+4*a[2])%36!=0)
n++;
printf("%d\n",n);
}
return 0;
}


原文地址:https://www.cnblogs.com/staginner/p/2186187.html