POJ1017 Packets

           这题是道贪心题,可以一步一步模拟的,不过需要点耐心和细心。

         (思路就不写了,看到别人的写的挺好的,想了解的请参考:優YoU http://blog.csdn.net/lyy289065406/article/details/6674366  )          

题目链接:http://poj.org/problem?id=1017

以下是我写的代码:

#include<stdio.h>
int main()
{
    int s,a[7],m=0,i;
    for (i=1;i<=6;i++)
    {
      scanf("%d",&a[i]);
      m+=a[i];
    }
    while (m>0)
    {
       s=a[6]+a[5]+a[4];
         a[1]=a[1]-a[5]*11;
           a[2]=a[2]-a[4]*5;
		   if (a[2]<=0) a[1]=a[1]+a[2]*4;
             s=s+a[3]/4; 
               a[3]%=4;
		if (a[3]>0) 
		{    s++;
		   if (a[2]>0)
		   {
             if (a[3]==1)
               {
                 if (a[2]>5)
                 {
                   a[2]-=5;
                   a[1]-=7;
                 }
                 else 
                 {
                      a[1]=a[1]-(27-a[2]*4);a[2]=0;
                 }
               }
             else if (a[3]==2)
               {
                 if (a[2]>3)
                 {
                   a[2]-=3;
                   a[1]-=6;
                 }
                 else 
                 {
                     
                      a[1]=a[1]-(18-a[2]*4); a[2]=0;
                 }
               }
             else if (a[3]==3)
               {
                 if (a[2]>1)
                 {
                   a[2]-=1;
                   a[1]-=5;
                 }
                 else 
                 {
                      
                      a[1]=a[1]-(9-a[2]*4);a[2]=0;
                 }
               }
		   }
		   else a[1]=a[1]-(36-a[3]*9);
		}
			 if (a[2]>0)
                 {
                    s+=a[2]/9;
                      a[2]%=9;
					  if (a[2]>0) s++;    
                    a[1]=a[1]-(36-a[2]*4);
                 }
                 if (a[1]>0)
                  {
                    s+=a[1]/36;
                    if (a[1]%36>0) s++;
                  }
             printf("%d\n",s);
          m=0;
        for (i=1;i<=6;i++)
           {
              scanf("%d",&a[i]);
              m+=a[i];
           }
    }
    return 0;
}  
                                        
             
             

                                                               感觉自己写的不太好,于是做完后,看了下别人的题解,看到某博客上的方法挺好的。

                                                                                     万里晴空 - 博客频道 - CSDN.NET

以下代码参考 万里晴空 - 博客频道 - CSDN.NET

#include <stdio.h>   
int main()   
  {   
    int N, a, b, c, d, e, f, y, x;                              
    int u[4]={0, 5, 3, 1};        
    while(1)
      {   
        scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);   
         if (a+b+c+d+e+f==0) break;   
            N = f + e + d + (c + 3) / 4;       //先将6*6,5*5,4*4,3*3的包好
              y = 5 * d + u[c % 4];            //y表示已经使用的N个箱子至多可容纳多少个2*2的包裹
                if(b > y) N += (b - y + 8 ) / 9;     //如果那N个箱子装不完2*2的包裹,再另外使用新的箱子
              x = 36 * N - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;    //表示当前已经使用的N个箱子至多可容纳多少个1*1的包裹
           if(a > x) N += ( a - x + 35 ) / 36;     //装不完再用新的箱子
        printf("%d\n", N);   
     }   
   return 0;
}   

这种方法的思路,刚好与前面的相反,前者是一步一步地为6*6,5*5,4*4,3*3开辟新箱将2*2,1*1的包填充空位,

后者是先给不能用于填充的开辟空箱6*6,5*5,4*5,3*3,

然后,看看已开辟的箱能够容纳多少用于填充的包裹,判断是否需要开辟新箱。

                                                                                                   

你可能感兴趣的:(C++,算法,poj)