Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

一个菜鸟的解题思路

Posted by 596380446 at 2014-04-28 20:30:34 on Problem 1017
这道题本来以为会很难的,结果却发现半个小时就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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator