【2022刷题】最少砝码

问题描述

你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 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


解题思路

首先举例,从一个砝码开始,具体如下表:

砝码数最大砝码重量可以算到的最大重量解释
111


由于要算从1到n所需的砝码,只能取第一个砝码为1

234


以1为基础,加入一个砝码:
  如果为1:只有1=1,2=1+1;
  如果为2:只有1=1,2=2,3=1+2;
  如果为3:有1=1,2=3-1,3=3,4=3+1;
  如果为4,取不到2,从此后面就更取不到了。

3913


  从上面可知,在两个砝码的情况下最多可以取到4,利用的砝码为1,3,故以此为基础。
  而想要求得最大重量,并且中途不会断,只需要令新加入的砝码的重量-两个砝码时的最大重量 = 两个砝码时的最大重量+1即可
  例如前两个砝码已经可以确定1-4,而想要5之后的重量并且要得到最大的,得到的方法只有加入的砝码-4=5,故取到9,这样后面的值就为(9-4=5)~(9+4=13),即5-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();
    }
	
}		

测试结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬泉旅人Winspr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值