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

今天看了一本图解算法的书,看完第一章真心觉得不错(我觉得只有书中可以让你有所感悟的书都是好书)。在这里推荐给大家

一开始以为有习题的答案,结果,找了好久都找不到。于是在这里我将我的做法分享出来,给大家看看。如果觉得对,我很高兴,因为可以给您一些参考,同时我也在进步,如果觉得不对,也请您指正,让我有改正的机会。

 

题目:

老王开杂货铺想送N块冬瓜糖砖给客户,每块冬瓜糖砖长宽高都是10厘米,老王希望将这N块冬瓜糖砖包装成一大包(x*y*z的长方体),以便运送。但为了响应环保,希望使用的包装纸越少越好。编写一个程序,输入N,输出最少的包装纸面积。

输入:9

输出:3000

 

个人想法:

求包装纸的面积其实就是糖砖暴露出来的面积,因为糖砖是正方形,所以我们考虑有几个面即可。打包的时候是打包成长方形,所以我们的做法是一层一层的构建。

如果一层是一个的话,每加一个,就会增加四个面,覆盖两个面,数据如下

糖砖个数糖砖面数糖砖覆盖面数糖砖暴露面数
1606
212210
3184

14

............
n6n(n-1)*24n+2

如果一层是两个的,三个的,依次分析。

我发现一层是四个的是比较合适的,一层是四个,推起来后,倒放,就是两层了。

糖砖个数糖砖面数糖砖覆盖面数糖砖暴露面数和上一层相比,覆盖数增加数
16060
2122102
3184142
4248164
-------------------------------------------------------------------------------------------------------------------------
53010202
63614224
74218244
84822264
-----------------------------------------------------------------------------------------------------------
95424302
106028324
116632344
127236364
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
n6n6n-{(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);
    }


}

 

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页