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