图解算法之习题一:老王的杂货铺

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
    }


}

猜你喜欢

转载自blog.csdn.net/BlingZeng/article/details/81909326