2021蓝桥杯JavaB组--货物问题、时间显示问题、最少砝码问题详细解析

货物摆放

1.题目

小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有n 箱货物要摆放在仓库,每箱货物都是规则的正方体。
小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上分别堆L、W、H 的货物,满足n = L × W × H。
给定n,请问有多少种堆放货物的方案满足要求。
例如,当n = 4 时,有以下6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当n = 2021041820210418 (注意有16 位数字)时,总共有多少种
方案?
提示:建议使用计算机编程解决问题。

2.代码

    public static long goods(long n) {
        int count = 0;
        ArrayList<Long> list = new ArrayList<>();
        double n2 = Math.sqrt(n);		//对n开平方。比如n为100,我们可以使用10*10=100,1*100=100
        								//那么我们在存1的时候顺便把100存进去,存2的时候把50放进集合中
        								//存4的时候把25存进集合,那么依次类推,只要存到10的时候,10后面的如25、50、100											//等数也已经被存进集合中。
        for(long i = 1; i <= n2; i++) {
            if(n % i == 0) {
                list.add(i);
                if(i != n/i ){		//以n为100为例子,当i=10时, n/i=i,不重复放进集合中。其他情况都将n/i放入集合中										
                    list.add(n/i);
                }
            }
        }
        //遍历集合中的元素,计算list.get(i) * list.get(j) * list.get(k) == n的个数,即为本题答案。
        for(int i = 0 ; i < list.size() ; i++ ) {
            for(int j = 0; j < list.size() ; j++ ) {
                if(list.get(i) * list.get(j) > n){
                    continue;
                }
                for(int k = 0; k < list.size(); k++ ) {
                    if(list.get(i) * list.get(j) * list.get(k) == n){
                        count++;
                    }
                }
            }
        }
        return count;
    }

答案:2430

时间显示

1.题目

小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示。
值为从1970 年1 月1 日00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。
小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

2.代码

本题主要是要理解%的含义

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long time = sc.nextLong();
        time = time/1000;                 //将ms转化为s
        int day = 24 * 60 * 60;     //一天的秒钟数
        int hour = 60 * 60;         //一小时的秒钟数
        int minute = 60;            //一分钟的秒钟数
        long h = time % (day) / hour;  //time % day表示不足一天的秒数  --->之后再除以hour表示有多少个小时  依次类推
        long m = time % (hour) / minute;    //与求小时一致
        long s = time % minute;	
        System.out.printf("%02d:%02d:%02d",h,m,s);    //按照格式输入。
    }

3.测试

输入样例

46800999
1618708103123

输出样例

13:00:00
01:08:23

最少砝码

1.题目

你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。

【输入格式】

输入包含一个正整数 N。

【输出格式】

输出一个整数代表答案。

【样例输入】

7

【样例输出】

3

【样例说明】
3 个砝码重量是 1、4、6,可以称出 1 至 7 的所有重量。
1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
少于 3 个砝码不可能称出 1 至 7 的所有重量。

2.解析

结果应该是最少的砝码数量
首先,如果要称的重量为1的话,只能选择重量为1的砝码,1是必选的一个砝码。

然后再称比1重的,反正都是要再加砝码,那我们为何不选一个能称的重量尽可能大的呢。
选1、2的砝码可以满足1=1,2=2,1+2=3
选1、3的砝码可以满足1=1,2=3-1,3=3,4=3+1
选1、4的砝码可以满足1=1,2=?无法称2,不合题意
因此我们选择的砝码组合是1、3,此时我们可以称的最大重量为4

当我们还需要再增加砝码时
同理可得
选1、3、9的组合可以满足小于等于13(13=1+3+9)的所有重量

从中可以发现一个规律,当我们需要第三个砝码是,前两个砝码(1、3)满足的最大重量已经是4了,下一个要满足的重量是5,我们遵循砝码尽可能大的原则,选择的第三个砝码的重量满足的条件是:它减去 已经可以称得的最大重量 可以得到 下一个需要称的重量。也就是weight - 4 = 5,可得weight为9

再往下推,可以得到下面的表格

砝码序号砝码重量总重量(可称出的最大重量)
111
234
3913
42740
count=count+1weight=weight*3total=total+weight

到此已经找到规律,可以写出这道题的代码了
表格的三列分别对应了

			weight = weight * 3;		
			count ++;
			total = total + weight;

具体解析可以参考:https://blog.csdn.net/Striver00/article/details/116031667

3.代码

public class MinimumWeight {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		int weight = 1;
		int total = 1;
		int count = 1;
		while(total < n) {
			weight = weight * 3;		
			count ++;
			total = total + weight;
		}
		System.out.println(count);
	}
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值