POJ Problem 1017

首先把題目說一下,防止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

相關文章
相關標籤/搜索