问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 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 的所有重量。
评测用例规模与约定
对于所有评测用例,1 ≤ N ≤ 1000000000。
运行限制
最大运行时间:1s
最大运行内存: 512M
解题思路
首先举例,从一个砝码开始,具体如下表:
砝码数 | 最大砝码重量 | 可以算到的最大重量 | 解释 |
---|---|---|---|
1 | 1 | 1 |
|
2 | 3 | 4 |
|
3 | 9 | 13 |
|
。。。 | 。。。 | 。。。 | 。。。 |
代码部分
有注释哦~
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int cnt = 1;//砝码数量
int maxw = 1;//可得到的最大重量
int maxfm = 1;//当前最大砝码重量
while(maxw<n) {
if(cnt==1) {//赋初值,推导得来
maxfm = 3;
}else {
maxfm = maxw+1+maxw;//关系,推导得来
}
cnt++;//加入新砝码
maxw = maxfm+maxw;//获得可取到的新重量
}
System.out.println(cnt);
scan.close();
//br.close();
}
}