POJ - 1017 貪心
阿新 • • 發佈:2018-11-19
這個題不難,關鍵是濾清思路,明確怎麼放是最大利用空間的。
還有POJ不曉得為啥子,炸了好幾天,這道題隔了好久才交上。
思路:
6*6:一個就要獨佔一個箱子
5*5:一個要獨佔一個箱子,放完後還可以再放11個1*1
4*4:一個要獨佔一個箱子,放完後可以再放5個2*2(先緊著大的放),然後如有空餘再用1*1填補
3*3:這個比較麻煩,要把情況分開考慮(看我程式碼裡分的情況)
2*2和1*1和上面思路一樣;
程式碼寫的不是很簡潔,大家湊合看吧,反正是ac了;
#include <iostream> using namespace std; int a[7]; int main() { while (!cin.eof()) { int sum = 0; for (int i = 1; i <= 6; i++) {cin >> a[i]; sum += a[i];} if (!sum) break; int ans = 0; if (a[6]) ans += a[6]; if (a[5]) { ans += a[5]; int area = a[5] * 11; a[1] = (a[1] - area) <= 0 ? 0 : (a[1] - area); } if (a[4]) { ans += a[4]; int area = 20 * a[4]; if (a[2]) { if (area - a[2] * 4 <= 0) { a[2] -= (area / 4); area = 0; } else { area -= a[2] * 4; a[2] = 0; } } if (area && a[1]) { if (area - a[1] <= 0) a[1] -= area; else a[1] = 0; } } if (a[3]) { ans += (a[3] / 4); a[3] %= 4; //3*3還剩下一部分 if (a[3]) { int area = 36 - (9 * a[3]); ans += 1; if (a[3] == 1) { area = 27; if (a[2]) { if (a[2] <= 5) { area -= (4 * a[2]); a[2] = 0; } else { area -= 20; a[2] -= 5; } } if (area) { if (a[1]) { if (a[1] <= area) a[1] = 0; else a[1] -= area; } } } else if (a[3] == 2) { area = 18; if (a[2]) { if (a[2] <= 3) { area -= (4 * a[2]); a[2] = 0; } else { area -= 12; a[2] -= 3; } } if (area) { if (a[1] >= area) a[1] -= area; else a[1] = 0; } } else if (a[3] == 3) { if (a[2]) { a[2] -= 1; if (a[1]) { if (a[1] <= 5) a[1] = 0; else a[1] -= 5; } } else { if (a[1]) { if (a[1] <= 9) a[1] = 0; else a[1] -= 9; } } } } } if (a[2]) { ans += (a[2] / 9); a[2] %= 9; if (a[2]) { int area = 36 - (4 * a[2]); a[1] = (a[1] - area <= 0) ? 0 : (a[1] - area); ans++; } } if (a[1]) { ans += (a[1] % 36 == 0) ? (a[1] / 36) : (a[1] / 36) + 1; } cout << ans << endl; } return 0; }