问题分析:
题目要求最少使用的砝码数量,那么我们尽量选取大的砝码,
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
砝码数量 | 砝码重量 | 能表示的最大重量 |
1 | 1 | 1 |
2 | 3 | 4(1+3) |
3 | 9 | 13(4+9) |
4 | 27 | 40(13+27) |
5 | 81 | 121(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);
}
}
测试用例的答案是:
提交代码通过。