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,

然後,看看已開闢的箱能夠容納多少用於填充的包裹,判斷是否需要開闢新箱。

                                                                                                   

發佈了43 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章