PKU1017——Packets
2009-04-26 00:53 Logic0 阅读(329) 评论(0) 编辑 收藏 举报http://acm.pku.edu.cn/JudgeOnline/problem?id=1017
贪心题
分析问题:
由于物品等高,故可以看作是一个平面填充问题。
贪心准则:从大到小依次填充箱子,用可能的最大的物品补齐空白空间
(1)6×6,一个占一个箱子,res += 1;
(2)5×5,一个占一个箱子,res += 1;还剩余11个空间,只能用1×1的物品进行填充,如果1×1物品不足11,全部放进去,否则,将1×1物品数减少11;
(3)4×4,一个占一个箱子,只能用2×2或1×1填充。根据贪心规则,先用2×2填充,如果仍有剩余,再用1×1填充到箱子满或者1×1物品数为0;
(4)3×3,4个占一个箱子,res += item[3]/4;剩下的item[3]%4个物品新开一个箱子,然后用2×2和1×1填充剩余空间
(5)2×2,9个占一个箱子,res += item[2]/9;剩下的item[2]%9个物品新开一个箱子,然后用1×1填充剩余空间
(6)1×1,36个占一个箱子,res += item[1]/36;若有剩下,新开一个箱子。
/**********************
*author :Logic0
*data :2009-4-25
**********************/
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <memory.h>
using namespace std;
int main()
{
int item[7];
cin>>item[1]>>item[2]>>item[3]>>item[4]>>item[5]>>item[6];
while(item[1]||item[2]||item[3]||item[4]||item[5]||item[6])
{
int res = 0;
int tmp = 0;
/************************process 6*6 *******************/
res += item[6];
/************************process 5*5 *******************/
while(item[5])
{
res += 1;
if(item[1] >= 11)
{
item[1] -= 11;
}
else
{
item[1] = 0;
}
item[5] -= 1;
}
/************************process 4*4 *******************/
while(item[4])
{
res += 1;
if(item[2] >= 5)
{
tmp = 5;
item[2] -= 5;
}
else
{
tmp = item[2];
item[2] = 0;
}
if(item[1] >= 20-4*tmp)
{
item[1] -= 20-4*tmp;
}
else
{
item[1] = 0;
}
item[4] -= 1;
}
/************************process 3*3*******************/
//(3*3)*4 to fill one box
tmp = item[3]/4;
res += tmp;
//left to fill another box
item[3] %= 4;
if(item[3] != 0)
{
res += 1;
if(item[2] >= (7-2*item[3]))
{
tmp = (7-2*item[3]);
item[2] -= (7-2*item[3]);
}
else
{
tmp = item[2];
item[2] = 0;
}
if(item[1] >= 36-item[3]*9-tmp*4)
{
item[1] -= 36-item[3]*9-tmp*4;
}
else
{
item[1] = 0;
}
}
/************************process 2*2 *******************/
tmp = item[2]/9;
res += tmp;
item[2] %=9;
if(item[2] != 0)
{
res += 1;
tmp = item[2];
if(item[1] >= 36-4*tmp)
{
item[1] -= 36-4*tmp;
}
else
{
item[1] = 0;
}
}
/************************process 1*1 *******************/
tmp = item[1]/36;
res += tmp;
item[1] %= 36;
if(item[1])
{
res += 1;
}
/************************process print*******************/
cout<<res<<endl;
res = 0;
memset(item,0,sizeof(item));
cin>>item[1]>>item[2]>>item[3]>>item[4]>>item[5]>>item[6];
}
return 0;
}