蓝桥杯:最少砝码

问题分析:


 题目要求最少使用的砝码数量,那么我们尽量选取大的砝码,

          1是必须要的砝码,因为当N=1时,1必须存在,所以砝码1要一个

          砝码2,可以和砝码1拼成 1+2=3 2-1=1满足了1-3

          砝码3,可以和砝码1拼成3+1=4 3-1=2,这时候同时满足了从1-4

          再看砝码4,可以拼成 4+1=5 4-1=3,只有1,3,4,5

          砝码5,可以拼成 1+5=6 5-1=4,只有1,4,5,6

          砝码6,可以拼成 1+6=7,6-1=5,只有1,5,6,7

          砝码7,可以拼成 1+7=8 7-1=6,只有1,6,7,8

          到这里差不多能看出来了,如果想要N能满足的同时砝码数量要少,那么从1-4,就是砝码1和3是最大的范围

          再从拥有1,3砝码来看

          砝码4,1-4=3,1+4=5,4+3=7,4-3=1,只有1,3,4,5,7不连续

          砝码5,...类推,我们就得到了如下的信息

          砝码数量:  1 2 3 4 5

          砝码重量:  1 3 9 27  81

          可以得到的正整数重量范围 1  1-4 1-13  1-40 1-121


砝码数量砝码重量能表示的最大重量
111
234(1+3)
3913(4+9)
42740(13+27)
581121(40+81)
.........
number++(每次自增)count*=3(每次*3)

scope=count*3+scope

Ps:scope是从砝码数量为2才是count*3+scope,当砝码数量为1时,scope只是1,所以我们循环条件应该是while(能表示的最大重量<N),N是得到的正整数重量

代码如下:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        scan.close();
        /*
          题目要求最少使用的砝码数量,那么我们尽量选取大的砝码,
          1是必须要的砝码,因为当N=1时,1必须存在,所以砝码1要一个
          砝码2,可以和砝码1拼成 1+2=3 2-1=1满足了1-3
          砝码3,可以和砝码1拼成3+1=4 3-1=2,这时候同时满足了从1-4
          再看砝码4,可以拼成 4+1=5 4-1=3,只有1,3,4,5
          砝码5,可以拼成 1+5=6 5-1=4,只有1,4,5,6
          砝码6,可以拼成 1+6=7,6-1=5,只有1,5,6,7
          砝码7,可以拼成 1+7=8 7-1=6,只有1,6,7,8
          到这里差不多能看出来了,如果想要N能满足的同时砝码数量要少,那么从1-4,就是砝码1和3是最大的范围
          再从拥有1,3砝码来看
          砝码4,1-4=3,1+4=5,4+3=7,4-3=1,只有1,3,4,5,7不连续
          砝码5,...类推,我们就得到了如下的信息
          砝码数量:  1 2 3 4 5
          砝码重量:  1 3 9 27  81
          可以得到的正整数重量范围 1  1-4 1-13  1-40 1-121
        */
        int number = 1;//砝码数量,默认必须有砝码1
        int count = 1;//砝码重量1,砝码每次递增都是*3
        int scope = 1;//范围从1开始
        while(scope<n){
          count *=3;  //count每次都是*3倍
          scope +=count;   //范围数量都是加上当前的砝码重量 
          number++;
        }
        System.out.println(number);
    }
}

测试用例的答案是:

提交代码通过。 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值