Bailian1017 裝箱問題
問題描述:(略)
問題分析:
這個問題與參考連結的題是同一題,隻是翻譯了一下。解題思路參見程式代碼中的注釋。
程式說明:(略)
參考連結:POJ1017 ZOJ1307 UVA311 UVALive5526 Packets【貪心】
題記:
題做多了難免遇到相同的題。
AC的C語言程式如下:
/* POJ1017 ZOJ1307 UVA311 UVALive5526 Packets */
#include <iostream>
#include <stdio.h>
using namespace std;
const int SIX = 6;
int orders[SIX + 1], sum;
int r33[] = {0, 5, 3, 1}; // r33[i]表示,箱子中裝入i個3*3之後,剩餘2×2空位有幾個
int main()
{
for(;;) {
sum = 0;
for(int i = 1; i <= SIX; i++) {
scanf("%d", &orders[i]);
sum += orders[i];
}
if(sum == 0)
break;
// 先計算6×6、5×5、4×4和3×3需要的箱子數量
sum = orders[6] + orders[5] + orders[4] + (orders[3] + 4 - 1) / 4;
// 計算4×4和3×3箱子裝箱後,空餘的2×2的空位有幾個
int r22 = orders[4] * 5 + r33[orders[3] % 4];
if(r22 < orders[2])
sum += (orders[2] - r22 + 9 - 1) / 9; // 1箱可以裝入9個2×2
// 計算5×5、4×4、3×3和2×2全部裝箱後,空餘的1×1的空位有幾個
int r11 = sum * 36 - orders[6] * 36 - orders[5] * 25 - orders[4] * 16 - orders[3] * 9 - orders[2] * 4;
if(r11 < orders[1])
sum += (orders[1] - r11 + 36 - 1) / 36;
printf("%d\n", sum);
}
return 0;
}