1017-R

        1.题目编号:1017-R
2.简单题意:有1*1、2*2、3*3、4*4、5*5、6*6大小的盒子,用6*6大小的盒子去装给出的箱子,求出用的最少的盒子数,输入6组数据,分别代表有1*1、2*2、3*3、4*4、5*5、6*6大小的盒子的个数。
3.解题思路形成过程:一个箱子里只能放下一个4*4或5*5或6*6大小的箱子,它们有多少个,就至少需要多少个箱子,再将其他的往里塞,先从最大的开始,一步一步来,有一个6*6盒子,总数加一,有一个5*5也是,但一个包装箱能放1个5*5的盒子和11个1*1的盒子,然后是4*4,只能放1个4*4盒子和5个2*2盒子,2*2盒子不够的空间用1*1的盒子补,4个3*3的盒子组成一个6*6的箱子,所以用了向上取整的方法,如果%4为0,那就需要一个箱子,不为4也需要一个箱子,填充别的,而且尽可能多的放置2*2盒子   放完后放1*1盒子。
4.感想:这道题看起来思路有,但做起来条件太多,有好几次都是漏下条件使代码不正确,思考问题一定要全面,多方面考虑,有些会有简易算法,要考虑细节问题,细节决定成败。
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
    int a,b,c,d,e,f;
    while(cin>>a>>b>>c>>d>>e>>f&&(a+b+c+d+e+f))
    {
      int sum=0;
      sum=f+e+d;
      if(a!=0)
         a=max(0,a-11*e);
      if(b>=d*5)
         b=b-d*5;
      else
      {
          a=max(0,a-4*(d*5-b));
          b=0;
      }
      sum+=(c+3)/4;//向上取整
      c%=4;
      if(c)
      {
           if(b>=7-2*c)
           {
                  b-=7-2*c;
                  a=max(0,a-(8-c));
           }
            else
           {
                 a=max(0,a-(36-4*b-9*c));
                 b=0;
           }
       }
       sum+=(b+8)/9;
       b%=9;
       if(b)
       {
             a=max(0,a-(36-b*4));
             b=0;
       }
       sum+=(a+35)/36;
       cout<<sum<<endl;
    }

    return 0;
}


5.AC代码:

你可能感兴趣的:(ACM,贪心算法)