最少砝码


题目

3424. 最少砝码 - AcWing题库

你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 $N$ 的正整数重量。

那么这套砝码最少需要包含多少个砝码?

注意砝码可以放在天平两边。

输入格式

输入包含一个正整数 $N$。

输出格式

输出一个整数代表答案。

数据范围

对于所有评测用例,$1≤N≤10^9$。

输入样例:

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 的所有重量。

思路

假设$n$个砝码能够表示的范围为$[0,k]$

如果第$n+1$个砝码的重量为$2k+1$

那么$k+1$的重量可以表示为$(2k+1) - k$

$k+2=(2k+1)-(k-1)$

…….

$3k=(2k+1)+(k-1)$

$3k+1=(2k+1)+k$

假设$f[i]$为共$i$个砝码能够表示的范围$k$

所以$f[i+1]=3*f[i]+1$

$f[1]=3^0=\frac{3^1-1}{2}$

$f[2]=3^1+3^0=\frac{3^2-1}{2}$

$f[3]=3^2+3^1+3^0=\frac{3^3-1}{2}$

$f[n]=\frac{3^n-1}{2}$

假设输入的值为$m$

那么$f[n]>=m$

即$\frac{3^n-1}{2}>=m$

化简得$3^n>=2m+1$

$n>=log_3(2m+1)$

得出:$n=\lceil log_3(2m+1) \rceil$

代码

import java.util.*;

public class Main
{
    static int n, cnt = 0;
    public static void main(String[] args) {
        Scanner inScanner = new Scanner(System.in);
        n = inScanner.nextInt();

        inScanner.close();
        System.out.println((int)Math.ceil(Math.log(2*n+1)/Math.log(3)));
    }
}
/*
3 3
0 3
1 2
0 2
*/

文章作者: 姜小白
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜小白 !
评论
  目录