19:裝箱問題(4.6演算法之貪心)
阿新 • • 發佈:2019-01-03
19:裝箱問題
總時間限制: 1000ms 記憶體限制: 65536kB
描述
一個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為1*1, 2*2, 3*3, 4*4, 5*5, 6*6。這些產品通常使用一個 6*6*h 的長方體包裹包裝然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的包裹數量。他們很需要有一個好的程式幫他們解決這個問題從而節省費用。現在這個程式由你來設計。
輸入
輸入檔案包括幾行,每一行代表一個訂單。每個訂單裡的一行包括六個整數,中間用空格隔開,分別為1*1至6*6這六種產品的數量。輸入檔案將以6個0組成的一行結尾。
輸出
除了輸入的最後一行6個0以外,輸入檔案裡每一行對應著輸出檔案的一行,每一行輸出一個整數代表對應的訂單所需的最小包裹數。
樣例輸入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
樣例輸出
2
1
#include<iostream>
using namespace std;
//http://noi.openjudge.cn/ch0406/19/
//書上面的解法,真的超級簡潔
int n,a,b,c,d,e,f,x,y;
int u[]={0,5,3,1};
//n個包裹,x是剩餘的2*2的位置,y是剩餘的1*1的位置
//u是3*3對4取餘後開啟新箱子需要的2*2的個數
int main(){
while(cin>>a>>b>>c>>d>>e>>f){
if(a==0&&b==0&&c==0 &&d==0&&e==0&&f==0)break;
n=f+e+d+(c+3)/4;
x=5*d+u[c%4];
if(x<b){
n=n+(b-x+8)/9;
}
y=36*n-36*f-25*e-16*d-9*c-4*b;
if(a>y){
n=n+(a-y+35)/36;
}
cout<<n<<endl;
}
}