http://poj.org/problem?id=1017
一个大箱 6*6*h
产品 有1*1*h 2*2*h 。。。。。。6*6*h
然后给各类型产品的个数 问最少用多少个大箱
太简洁了 思路太好 值得学习
#include<iostream>
using namespace std;
int main(){
int num[7];
int threetwo[4] = {0, 5, 3, 1};//当一个大箱放0个3*3 补0个2*2 。放1个3*3 补5个2*2 。 放2个3*3 补3个2*2 。放3个3*3 补1个2*2
while (1){
int sum = 0;
for (int i = 1; i <= 6; ++i) {
scanf("%d", &num[i]);
sum += num[i];
}
if (!sum){
break;
}
int ans = 0;
ans += num[6] + num[5] + num[4] + (num[3] + 3) / 4;//6*6 5*5 4*4 3*3(一个大箱可以放4个) 其他都会占一个大箱
//6*6搞定 5*5可以补1*1 4*4可以补2*2 1*1 3*3 以补2*2 1*1
int two, one;
//一个大箱可以放 1个4*4 和 5个 2*2
two = 5 * num[4] + threetwo[num[3] % 4];//这个two是最多放2*2的个数
if (two < num[2]){//还不够放 就要加大箱来放2*2
ans += (num[2] - two + 8) / 9;
}
one = ans * 36 - 36 * num[6] - 25 * num[5] - 16 * num[4] - 9 * num[3] - 4 * num[2];
if (one < num[1])
ans += (num[1] - one + 35) / 36;
printf("%d\n", ans);
}
return 0;
}
相比我的
#include<iostream>
#include<cstdio>
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){
break;
}
int ans = 0;
if (num[6]){
ans += num[6];
//printf("6 %d\n", ans);
}
if (num[5]){
ans += num[5];
num[1] -= 11 * num[5];//都放1*1
if (num[1] < 0)
num[1] = 0;
//printf("5 %d\n", ans);
}
if (num[4]){
ans += num[4];
int tmp = 20 * num[4];//能剩tmp空间
tmp -= num[2] * 4; //减去2*2占的空间 如果num【2】 放不完 tmp自然负数
num[2] -= num[4] * 5;//能放多少就放多少
if (num[2] < 0)//放完了num【2】
num[2] = 0;
//如果2 * 2 已经放完了 1*1还有 就放 tmp个1*1 tmp自然是正数
if (num[2] == 0 && num[1]){
num[1] -= tmp;
if (num[1] < 0)
num[1] = 0;
}
//printf("4 %d\n", ans);
}
if (num[3]){
ans += num[3] / 4;//6*6可以放4个3*3
int tmp = num[3] % 4;
//还有3*3剩 单独占一个大箱 剩1个2个3个
if (tmp){
ans++;
int leave = 36 - tmp * 9;
//可以放5个2*2 7个1*1
if (leave == 27){
if (num[2]){
num[2] -= 5;
if (num[2] < 0)
num[2] = 0;
}
if (num[1]){
num[1] -= 7;
if (num[1] < 0)
num[1] = 0;
}
}
//可以放3个2*2 6个1*1
else if (leave == 18){
if (num[2]){
num[2] -= 3;
if (num[2] < 0)
num[2] = 0;
}
if (num[1]){
num[1] -= 6;
if (num[1] < 0)
num[1] = 0;
}
}
//可以放1个2*2 5个1*1
else if (leave == 9){
if (num[2]){
num[2] -= 1;
if (num[2] < 0)
num[2] = 0;
}
if (num[1]){
num[1] -= 5;
if (num[1] < 0)
num[1] = 0;
}
}
}
//printf("3 %d\n", ans);
}
if (num[2]){
ans += num[2] / 9;
int tmp = num[2] % 9;
if (tmp){
ans++;
int leave = 36 - 4 * tmp;
if (num[1]){
num[1] -= leave;
if (num[1] < 0)
num[1] = 0;
}
}
//printf("2 %d\n", ans);
}
if (num[1]){
ans += num[1] / 36;
if (num[1] % 36)
ans++;
//printf("1 %d\n", ans);
}
printf("%d\n", ans);
}
return 0;
}