首先把題目說一下,防止POJ改動後題號出問題 簡單講,就是要把11, 22, ..., 66的六種包裝放在66的箱子裏,高度都是同樣的,求須要最少的箱子數ide
輸入數據從左到右,用空格分開,每一個數對應包裝數如 0 0 4 0 0 1 表示有四個33和一個66測試
輸入數據每行爲一組,描述一個測試用例 當某行出現六個0時,輸入結束code
輸出數據每行輸出對應訂單最少箱子數get
題目很簡單,關鍵是解法 首先一點要明確,如何來裝纔是最少的 簡單講,如生命中的大石塊裏同樣,先裝大的 如何這樣想:補位的時候確定要先用大的補位,小的能夠補在更多的地方,不值得先用 因此在補位以前的順序其實無所謂,即你先裝33再往更大了裝,最後裝22和11也是同樣的,由於補位從22開始io
那麼很明確了,先處理66,再55,再……class
筆者用了很笨的方法,寫了一個類,把箱子描述了一下,而後寫了put方法,每次先把當前的包裹put_in_old_boxes,而後再把剩下的裝箱 原理是沒錯的,可是大牛就是大牛,一樣的原理就能寫出以下極簡的代碼,在此多多膜拜。原理
本人代碼就不獻醜了,看了大牛的代碼,無地自容啊方法
下面貼出大牛代碼以下:數據
#include<stdio.h> int main() { int n,a,b,c,d,e,f,x,y; int u[4]={0,5,3,1}; while(1) { scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f); if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break; n=d+e+f+(c+3)/4; //這裏很巧妙,(c+3)/4正好是3*3所佔用的箱數 y=5*d+u[c%4]; //這裏是計算現有的空位能裝多少2*2 if(b>y) { n+=(b-y+8)/9; //若是有多的2*2那麼把多的部分裝箱 } x=36*n-36*f-25*e-16*d-9*c-4*b; // 計算在當前狀況下還有多少個1*1空位 if(a>x) { n+=(a-x+35)/36; //多出來的1*1裝箱 } printf("%d\n",n); //輸出 } return 0; }
須要在線測試的同窗能夠來此 1di