来源:http://poj.org/problem?id=1017
题意:有一些箱子,面积分别是1 * 1,2 * 2 ,3 * 3, 4 * 4, 5 * 5, 6 * 6, 高度相等。现在有6 * 6的大箱子,其高度和箱子一样,问最少需要多少个大箱子。
思路:一道水题,但是写了好久。易知,6*6的需要一个满箱子,5*5的需要一个满箱子,还可以放一些1 * 1的,4 * 4的放过后,首先用2*2的填,然后用1*1的填,同理对于3*3的。一个模拟的过程,注意细节即可。
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main(){
int num[7];
while(1){
int sum = 0;
for(int i = 1; i <= 6; ++i){
scanf("%d",&num[i]);
sum += num[i];
}
if(sum == 0)
break;
int ans = 0;
ans += num[6];
ans += num[5];
if(num[1] >= 11 * num[5]){
num[1] = num[1] - 11 * num[5];
}
else
num[1] = 0;
ans += num[4];
int cnt2 = 0;
if(num[2] >= 5 * num[4]){
num[2] = num[2] - 5 * num[4];
cnt2 = 5 * num[4];
}
else{
cnt2 = num[2];
num[2] = 0;
}
int squre = 36 * num[4] - 16 * num[4] - cnt2 * 4;
if(squre){
if(num[1] >= squre)
num[1] -= squre;
else
num[1] = 0;
}
int x = num[3] / 4;
int y = num[3] % 4;
ans += x;
cnt2 = 0;
if(y){
ans += 1;
if(y == 1){
if(num[2] >= 5){
num[2] -= 5;
cnt2 = 5;
}
else{
cnt2 = num[2];
num[2] = 0;
}
}
else if(y == 2){
if(num[2] >= 3){
num[2] -= 3;
cnt2 = 3;
}
else{
cnt2 = num[2];
num[2] = 0;
}
}
else if(y == 3){
if(num[2] >= 1){
num[2] -= 1;
cnt2 = 1;
}
else{
cnt2 = num[2];
num[2] = 0;
}
}
}
squre = 36 - y * 9 - cnt2 * 4;
if(squre != 36){
if(num[1] >= squre){
num[1] -= squre;
}
else
num[1] = 0;
}
if(num[2]){
x = num[2] / 9;
y = num[2] % 9;
ans += x;
if(y){
ans++;
squre = 36 - y * 4;
if(num[1] >= squre){
num[1] -= squre;
}
else
num[1] = 0;
}
}
if(num[1]){
x = num[1] / 36;
y = num[1] % 36;
ans += x;
if(y)
ans++;
}
printf("%d\n",ans);
}
return 0;
}