首页 > 代码库 > uva--311+贪心
uva--311+贪心
题意:
货物和箱子是等高的,然后货物的尺寸有1×1,2×2.。。。。6×6六种,箱子的尺寸统一是6*6的。给定6种货物每种的数量,然后求将它们全部装箱所需要的最小箱子数。
思路:
显然要想箱子数最小,就要尽量把每个箱子都装满,那么我们可以每个箱子都选择先装大的,然后再填充小大(因为装了大的可以填充小的,而装了小的确不一定能再装进大的了)。
具体的:每个6*6的货物肯定要一个箱子。
每个5×5的货物可以和11个1×1的货物装一个箱
每个4×4的货物可以和5个2×2的装一个箱
3×3货物的情况比较复杂:
一个箱子可以装4个3×3的或3个3×3+1个2×2+5个1×1或2个3×3+3个2×2+6个1×1
或1个3×3+5个2×2+7个1×1;
然后就是2×2和1×1的货物依次摆放了。
注意上面如果2×2的货物不够的话就用1×1的补,我们可以假定1×1的货物数目是无限的。(有的解题思路也把2×2的看成无限的,到最后如果小于0再用1×1的补)。
具体实现的时候对2×2货物的数目要注意判定,防止他小于0;
代码如下:
<span style="font-size:18px;">#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int a[9],i,j,k,cnt; while(1) { int flag=0; for(i=1;i<=6;i++) { scanf("%d",&a[i]); if(!a[i]) flag++; } if(flag==6) break; cnt=a[5]+a[6]; a[1]-=a[5]*11; if(a[4]>0) { cnt+=a[4]; if(a[2]>=5*a[4]) a[2]-=5*a[4]; else { if(a[2]>=0) { a[1]-=(20*a[4]-a[2]*4); a[2]=0; } } } if(a[3]>0) { cnt+=a[3]/4; a[3]=a[3]%4; if(a[3]) { cnt++; if(a[3]==3) k=1; else if(a[3]==2) k=3; else if(a[3]==1) k=5; if(a[2]>=k) { a[2]-=k; j=36-a[3]*9-k*4; a[1]-=j; } else { if(a[2]>=0) { j=36-a[3]*9-a[2]*4; a[1]-=j; a[2]=0; } } } } if(a[2]>0) { cnt+=a[2]/9; a[2]=a[2]%9; if(a[2]) { cnt++; k=36-a[2]*4; a[1]-=k; } } if(a[1]>0) { cnt+=a[1]/36; if(a[1]%36) cnt++; } printf("%d\n",cnt); } return 0; }</span>
uva--311+贪心
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。