代码改变世界

PKU1017——Packets

2009-04-26 00:53  Logic0  阅读(326)  评论(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;
 }