
All Posts ←
← All Posts
POJ 1017 Packets
Tecker Yu
AI Native Cloud Engineer × Part-time Investor
Topic: Greedy Algorithm
Solution Report
#include <cstdio>
#include <algorithm>
int square[7];
// Solution: Always place the largest items first
int solve() {
int res = 0;
// 6x6 directly forms one box
res += square[6];
// 5x5 forms one box first, then fill with 1x1
res += square[5];
square[1] -= 11 * square[5];
// 4x4 forms one box first, then fill with 2x2, 1x1
res += square[4];
int remain = 20 * square[4];
while(remain != 0) {
if (square[2] > 0) {
square[2]--;
remain-=4;
} else if (square[1] > 0) {
square[1]--;
remain--;
} else {
break;
}
}
// 3x3 priority: use 3x3 to form boxes first, then 2x2, 1x1
res += square[3] / 4;
square[3] %= 4;
if (square[3] > 0) {
res++;
int a;
// Trap: 2x2 has quantity restrictions when filling! Handle by cases
switch(square[3]) {
case 1:
a = 5;
remain = 27;
break;
case 2:
a = 3;
remain = 18;
break;
case 3:
a = 1;
remain = 9;
break;
}
while(remain && a && square[2] > 0) {
remain-=4;
square[2]--;
a--;
}
square[1]-=remain;
}
// If 2x2 still remains, form boxes by themselves, remaining ones continue to combine with 1x1
if (square[2] > 0) {
res += square[2] / 9;
square[2] %=9;
if (square[2] > 0) {
res++;
square[1] -= 36 - 4 * square[2];
}
}
// If 1x1 still remains, can only form boxes by themselves
if (square[1] > 0) {
res += square[1] / 36;
if (square[1] % 36) res++;
}
return res;
}
int main() {
int i;
while(1) {
for(i=1;i<=6;i++) {
scanf("%d", &square[i]);
}
if (square[1]+square[2]+square[3]+square[4]+square[5]+square[6] == 0) {
break;
}
printf("%d\n", solve());
}
return 0;
}Views