POJ 1017 装箱问题 【模拟】

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;
} 

猜你喜欢

转载自blog.csdn.net/liangnimahanwei/article/details/82942769