问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 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
package blueMatch;
import java.util.ArrayList;
import java.util.Scanner;
public class 最小砝码 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int N=scan.nextInt();
ArrayList<Integer> list=new ArrayList<>(); //存储用到的砝码
list.add(1); //1是必选的,如果N==1的话
int sum=1; //存储能加到的最大数
while(N>sum) { //如果最大的数已经超过或等于N的话退出循环
int next=sum+(sum+1); //下一个砝码选取尽量大的
//下一个砝码的值减去当前能表示的最大值等于最大值+1,就能表示最大值的下一个值了
sum=sum+next; //更新最大能表示的值
list.add(next); //将下一个砝码加进集合
}
System.out.println(list.size()); //list的大小即为砝码的个数
scan.close();
}
}
本文介绍如何使用最少的砝码,通过算法计算出能精确称量从1到N的所有正整数的最小砝码集合。关键步骤包括逐步增加砝码重量,确保覆盖所有可能的重量组合。
9077

被折叠的 条评论
为什么被折叠?



