POJ 1017——Packets

题目链接:http://poj.org/problem?id=1017

高只是摆设,题目只是平面填图,翻译过来就是,有1*1,2*2,3*3,4*4,5*5,6*6六种纸板,给出这几个面板的数量,问最少需要多少个6*6纸框才能装完,不才,只能一步一步模拟。

思路:6*6只能单独装成一个,一个5*5可以附带11个1*1,一个4*4可以附带5个2*2或若干个2*2和若干个1*1,3*3的因为可能造成空缺,只能单独留出来,先塞2*2的,再塞1*1的。

代码流程:4,5,6每一个都要单独分出一个纸箱来装,加到count里,装5*5的纸箱能装11个1*1,5*5的纸箱数量乘以11就是可以顺便带走的1*1数量,若1*1的数量大于这个数,则减去这个数,否则1*1的纸箱数量置零;装4*4的纸箱可以附带5个2*2,4*4的纸箱数量乘以5就是可以顺便带走的2*2的数量,若2*2的数量大于这个数,则减去这个数,否则2*2的纸箱数量置零,剩下的用1*1填,判断同上;把1*1的数量对36取余,把2*2的数量对9取余,把3*3的数量对4取余,因为36个1*1或9个2*2或4个3*3刚好能一起装入6*6的纸箱,剩下的3*3的数量范围是0~4,数量是0则跳过,一个6*6纸箱能带走1个3*3和5个2*2或2个3*3和3个2*2或3个3*3和1个2*2,不足用1*1填,判断同上;剩下的1*1和2*2不会造成无法填补的空缺,把它们的面积加起来对36取余判断,若刚好等于0,则需要的箱子是面积/36,否则是面积/36+1。

惨不忍睹的AC代码如下:

#include<stdio.h>
int main()
{
	int a[7];
	int sum;
	int count;
	int i;
//	freopen("d://in.txt","r",stdin);
	for(i=1,sum=0;i<7;i++){
		scanf("%d",&a[i]);
		sum=sum+a[i];
	}
	while(sum!=0){
		count=0;
		count=a[6]+a[5]+a[4];
		if(a[5]!=0){
		    if(a[1]>=a[5]*11){
			    a[1]=a[1]-a[5]*11;
		    }
		    else{
			    a[1]=0;
		    }
		}
		if(a[4]!=0){
		    if(a[2]>=a[4]*5){
			    a[2]=a[2]-a[4]*5;
		    }
		    else{
		     	if(a[1]>=a[4]*5*2*2-a[2]*2*2){
			    	a[1]=a[1]-(a[4]*5*2*2-a[2]*2*2);
		     	 }
			    else{
			 	    a[1]=0;
			    }
			    a[2]=0;
		    }
	    }
		count=count+a[3]/4+a[2]/9+a[1]/36;
		a[3]=a[3]%4;
		a[2]=a[2]%9;
		a[1]=a[1]%36;
		if(a[3]>0){
			count++;
		    if((36-a[3]*3*3-8+a[3])/4<=a[2]){
			    a[2]=a[2]-(36-a[3]*3*3-8+a[3])/4;
			    if(a[1]>=7){
				    a[1]=a[1]-7;
			    }
			    else{
				    a[1]=0;
			    }
		    }
		    else{
			    if(a[1]>=36-a[3]*3*3-a[2]*2*2){
				    a[1]=a[1]-(36-a[3]*3*3-a[2]*2*2);
			    }
			    else{
				    a[1]=0;
		    	}
		    	a[2]=0;
		    }
     	}
		sum=a[1]+a[2]*2*2;
		if(sum%36==0){
			count=count+sum/36;
		}
		else{
			count=count+sum/36+1;
		}
		printf("%d\n",count);
		for(i=1,sum=0;i<7;i++){
		    scanf("%d",&a[i]);
		    sum=sum+a[i];
  	    }
  	}
  	return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值