版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BlingZeng/article/details/81909326
今天看了一本图解算法的书,看完第一章真心觉得不错(我觉得只有书中可以让你有所感悟的书都是好书)。在这里推荐给大家
一开始以为有习题的答案,结果,找了好久都找不到。于是在这里我将我的做法分享出来,给大家看看。如果觉得对,我很高兴,因为可以给您一些参考,同时我也在进步,如果觉得不对,也请您指正,让我有改正的机会。
题目:
老王开杂货铺想送N块冬瓜糖砖给客户,每块冬瓜糖砖长宽高都是10厘米,老王希望将这N块冬瓜糖砖包装成一大包(x*y*z的长方体),以便运送。但为了响应环保,希望使用的包装纸越少越好。编写一个程序,输入N,输出最少的包装纸面积。
输入:9
输出:3000
个人想法:
求包装纸的面积其实就是糖砖暴露出来的面积,因为糖砖是正方形,所以我们考虑有几个面即可。打包的时候是打包成长方形,所以我们的做法是一层一层的构建。
如果一层是一个的话,每加一个,就会增加四个面,覆盖两个面,数据如下
糖砖个数 | 糖砖面数 | 糖砖覆盖面数 | 糖砖暴露面数 |
1 | 6 | 0 | 6 |
2 | 12 | 2 | 10 |
3 | 18 | 4 | 14 |
... | ... | ... | ... |
n | 6n | (n-1)*2 | 4n+2 |
如果一层是两个的,三个的,依次分析。
我发现一层是四个的是比较合适的,一层是四个,推起来后,倒放,就是两层了。
糖砖个数 | 糖砖面数 | 糖砖覆盖面数 | 糖砖暴露面数 | 和上一层相比,覆盖数增加数 |
1 | 6 | 0 | 6 | 0 |
2 | 12 | 2 | 10 | 2 |
3 | 18 | 4 | 14 | 2 |
4 | 24 | 8 | 16 | 4 |
--------------------------- | ----------------------- | ------------------------ | ------------------------ | ----------------------- |
5 | 30 | 10 | 20 | 2 |
6 | 36 | 14 | 22 | 4 |
7 | 42 | 18 | 24 | 4 |
8 | 48 | 22 | 26 | 4 |
----------------------- | ----------------------- | ---------------------- | -------------------- | ------------------- |
9 | 54 | 24 | 30 | 2 |
10 | 60 | 28 | 32 | 4 |
11 | 66 | 32 | 34 | 4 |
12 | 72 | 36 | 36 | 4 |
。。。。。 | 。。。。。。 | 。。。。。。 | 。。。。。。 | 。。。。。。。 |
n | 6n | 6n-{(m/4-1)*10+16+(m%4-1)*2+4} | (m/4-1)*10+16+(m%4-1)*2+4 |
从上表可以看出,“和上一层相比,覆盖数增加数“ 这个是规律所在,并且在第一层不遵循这个规则,因此我们可以总结出一个规律:m/4 算的是可以堆几层,如果是一层,则是16,如果是两层则是26,三层则是36,因为除第一层外,每层增加的面数是一样的,都是10个,因此我们可以通过层数来计算面数。m%4算的是在整层之后,多余几个,如果是一个则增加4,两个增加6,三个增加8.
java程序代码如下:
package tujiesuanfa;
import java.util.Scanner;
/**
* @author :Bling
* @version V1.0
* @Description:
* @date 2018/8/21 16:54
*/
public class LaoWangZaHuoPu {
public final static Integer AREA = 100;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean flag = true;
int number = 0;
int result = 0;
while (flag){
try {
number = scanner.nextInt();
flag = false;
}catch (Exception e){
System.out.println("error input");
}
}
if(number<=4&&number>0){
int temp = 0;//记录被覆盖的面数
switch(number){
case 4: temp += 4;
case 3: temp += 2;
case 2: temp += 2;
}
result = (number*6 - temp) * AREA;
}else if(number > 4){
result = ((number/4-1)*10+16+(number%4-1)*2+4)*AREA;
}else{
System.out.println("error input");
}
System.out.println(result);
}
}