pku1017

大意是说:将1*1,2*2,3*3,4*4,5*5,6*6的盒子放入6*6的盒子中,最少需要多少盒子?

典型的贪心算法,先放6*6,5*5,4*4的,5*5剩下的只能放1*1的,而4*4放剩下的先放2*2,不够再放1*1的。。具体看代码:

#include<iostream>
using namespace std;
int main(){
	int n1,n2,n3,n4,n5,n6;
	int sum;
	while(cin>>n1>>n2>>n3>>n4>>n5>>n6){
		if(n1==0 && n2==0 && n3==0 && n4==0 && n5==0 && n6==0)
			break;
		sum =0;
		sum += n6+n5+n4;
		//计算5*5剩余的格子
		if(n5 > 0)
			n1 -= 11*n5;
		//计算4*4剩余的格子
		if(n4 >0 ){
			if(n2 >0)
				n2 -= 5*n4;
			//如果2*2的格子不够填满剩余的格子则用1填
			if(n1 >0 && n2 <0)
				n1 -= (-n2)*4;
		}
		//计算3*3的格子
		if(n3 >0){
			sum += n3/4;
			n3 = n3%4;
			if(n3 > 0){
				//有多余的3*3先用2*2来填
				sum++;
				if(n2 >0){
					n2 -= 1+(3-n3)*2;
					//如果2*2的没填够
					if(n2 <=0)
						n1 -= (-n2)*4+7;
					else
						n1 -= 7;
				}
				//如果没有2*2的了,直接用1*1填
				else if(n1 >0){
					n1 -= 9*(4-n3);
				}
			}
		}
		if(n2 > 0){
			sum += n2/9;
			n2 = n2%9;
			if(n2 >0)
				sum++;
		}
		if(n1 > 0){
			if(n2 >0){
				n1 -= (36-n2*4);
				if(n1 >0){
					sum += n1/36;
					if(n1 % 36 != 0)
						sum++;
				}
			}
			else{
				sum += n1/36;
				if(n1 % 36 != 0)
					sum++;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

这是很常见的解法了,但在别人博客中看到非常简单的解法,能达到0ms。。目前我的代码水平还没达到,待续。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值