解题思路:
简单贪心算法
1. 6*6的产品每个会占用一个完整的箱子,并且没有空余空间
2. 5*5的产品每个占用一个新的箱子,并且留下 11 个可以盛放 1*1的产品的空余空间
3. 4*4的产品每个占用一个新的箱子,并且留下5 个可以盛放2*2 的产品的空余空间
4. 3*3的产品情况比较复杂,首先3*3 的产品不能放在原来盛有5*5 或者4*4 的箱子中,那么必须为3*3 的产品另开新的箱子,新开的箱子数目等于3*3 的产品的数目除以4向上取整
同时需要讨论为3*3 的产品新开箱子时,剩余的空间可以盛放多少2*2 和 1*1 的产品
1. 3*3 的产品的数目好是4的倍数,这时还剩0个2*2的空位
2. 3*3 的产品数目是4 的倍数加1,这时还剩5个2*2的空位和7个1*1的空位;
3. 3*3 的产品数目是4 的倍数加2,这时还剩3个2*2的空位和6个1*1的空位;
4. 3*3 的产品数目是4 的倍数加3,这时还剩1个2*2的空位和5个1*1的空位;
处理完3*3的产品,就可以比较一下剩余的2*2的空位和2*2产品的数目,如果产品数目多,就将2*2 的空位全部填满,再为2*2 的产品打开新箱子
比较一下剩下空间与1*1 的产品数目,如果空位多,将1*1的产品全部填入空位,否则,先将1*1的空 位填满,然后再为 1*1 的产品打开新的箱子。
注意事项:
参考了别人的攻略,整理下来,经常看看,总有一天自己也会成为这样的大牛!
优先考虑大箱子和刚好塞满的情况,要不怎么说贪心呢
参考代码:
#include<stdio.h> int main(){ int n,a,b,c,d,e,f,x,y; //n用来存储需要的箱子数目,y用来存储 2*2 的空位数目 // x 用来存储 1*1 的空位数目。 int u[4]={0,5,3,1}; //数组u 表示3*3 的产品数目分别是 4的倍数,4 的倍数+1, 4 的倍数+2, 4的倍数+3时 //为3*3的产品打开的新箱子中剩余的 2*2的空位的个数 while(1){ scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f); if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break; n=d+e+f+(c+3)/4; //较大的产品只能自己开箱,无法放入更大的箱子中 //(c+3)/4 正好等于 c 除以4向上取整的结果 y=5*d+u[c%4]; //每一个4*4的箱子装过后还可以再装5个2*2的箱子 //还有3*3的箱子如果没填满6*6的箱子的话,也可以用来装2*2的箱子 //5*5的箱子则只能装1*1的情况了 if(b>y)//如果要装的2*2的箱子的数目比提供的空间要多 //那么多的部分要新开一些箱子 n+=(b-y+8)/9; //(b+8)/9 向上取整 x=36*n-36*f-25*e-16*d-9*c-4*b; //多出来的面积即1*1的空位数目 if(a>x) //空间不够则新开箱 n+=(a-x+35)/36; //向上取整 printf("%d\n",n); } return 0; }
0.0分
8 人评分
C二级辅导-阶乘数列 (C语言代码)浏览:891 |
【数组的距离】 (C语言代码)浏览:636 |
C二级辅导-求偶数和 (C语言代码)浏览:632 |
C二级辅导-公约公倍 (C语言代码)浏览:1550 |
C语言程序设计教程(第三版)课后习题9.4 (Java代码)浏览:1446 |
回文数(一) (C语言代码)浏览:809 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:790 |
简单的a+b (C语言代码)浏览:385 |
WU-输入输出格式练习 (C++代码)浏览:1133 |
C语言程序设计教程(第三版)课后习题6.8 (C++代码)浏览:614 |