| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
一个菜鸟的解题思路这道题本来以为会很难的,结果却发现半个小时就ac了- -!;
说一下自己的思路吧,挺简单的:
首先把物品分成两类,第一类是6*6,5*5,4*4的物品,一个箱子中只能放入一个第一类的物品。第二类则是3*3,2*2,1*1的物品,其中2*2,1*1用于填充。
首先,取6*6物品数目,每个物品占一个箱子,无盈余空间。
其次,取5*5物品,每个物品占的箱子最多可以再放入11个1*1的物品。
继续,取4*4物品,每个物品占的空间最多可以放入5个2*2的物品,若2*2物品不足,则用1*1填充。
接着,取3*3物品,其中每4个可以填充一个箱子。如此填充直到3*3物品数量少于4个,接着优先填充3*3物品,其次2*2物品,盈余空间用来填充1*1物品。
最后只剩下2*2物品和1*1物品则可以随意装填了--
#include<iostream>
using namespace std;
int num[7];
int box;
int getBox()
{
/*处理6*6*/
box=num[6];
box+=num[5];
num[1]-=11*num[5];
if(num[4])
{
box+=num[4];
if(num[2]>=num[4]*5) num[2]-=num[4]*5;
else
{
num[1]-=36*num[4]-16*num[4]-4*num[2];
num[2]=0;
}
}
if(num[3])
{
box+=num[3]/4;
num[3]%=4;
switch(num[3])
{
case 3:{
box++;
if(num[2]>=1) num[2]-=1,num[1]-=5;
else num[1]-=9;
break;
}
case 2:{
box++;
if(num[2]>=3) num[2]-=3,num[1]-=6;
else
{
num[1]-=18-num[2]*4;
num[2]=0;
}
break;
}
case 1:{
box++;
if(num[2]>=5) num[2]-=5,num[1]-=7;
else
{
num[1]-=27-num[2]*4;
num[2]=0;
}
break;
}
case 0:break;
}
}
box+=num[2]/9;
num[2]%=9;
if(num[1]<0) num[1]=0;
int s=num[1]+num[2]*4;
if(s%36)
{
box+=s/36+1;
}
else box+=s/36;
return box;
}
int main()
{
while(1)
{
int i,j;
int sum=0;
for(i=1;i<=6;i++)
{
cin>>num[i];
sum+=num[i];
}
if(!sum) break;
cout<<getBox()<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator