第十二届蓝桥杯省赛JavaB组 试题 G: 最少砝码

【问题描述】

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

代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		int weight = 1;
		int count = 1;
		int total = 1;
		while (total < n) {
			count++;
			weight *= 3;
			total += weight;
		}
		System.out.println(count);
	}
}

解析

结果应该是最少的砝码数量
首先,如果要称的重量为1的话,只能选择重量为1的砝码,1是必选的一个砝码。

然后再称比1重的,反正都是要再加砝码,那我们为何不选一个能称的重量尽可能大的呢。
选1、2的砝码可以满足1=1,2=2,1+2=3
选1、3的砝码可以满足1=1,2=3-1,3=3,4=3+1
选1、4的砝码可以满足1=1,2=?无法称2,不合题意
因此我们选择的砝码组合是1、3,此时我们可以称的最大重量为4

当我们还需要再增加砝码时
同理可得
选1、3、9的组合可以满足小于等于13(13=1+3+9)的所有重量

从中可以发现一个规律,当我们需要第三个砝码是,前两个砝码(1、3)满足的最大重量已经是4了,下一个要满足的重量是5,我们遵循砝码尽可能大的原则,选择的第三个砝码的重量满足的条件是:它减去 已经可以称得的最大重量 可以得到 下一个需要称的重量。也就是weight - 4 = 5,可得weight为9

再往下推,可以得到下面的表格

砝码序号砝码重量总重量(可称出的最大重量)
111
234
3913
42740
count=count+1weight=weight*3total=total+weight

到此已经找到规律,可以写出这道题的代码了
表格的三列分别对应了

count++;		//count=count+1
weight*=3;		//weight=weight*3
total+=weight;	//total=total+weight

其中总重量是当前所有砝码之和,因此必须先乘3,后加到总重量里,除此之外,三行代码的顺序可调换

如果想证明的话,可以发现,取第三个砝码是weight - 4 = 5,要求的下一个重量5是总重量+1,即下一个砝码重量是当前总重量*2+1,nextWeight = total * 2+1,也可以表示为要求的下一个砝码重量weight=previousTotal * 2 + 1
证明第count次增加的砝码都是3的count-1次方

当count=1时,砝码只有一个,重量为1, 3 c o u n t − 1 3^{count-1} 3count1=1

当count=2时,砝码组合为1、3,是首项为1,公比为3的等比数列

设count=k(k>=2)时,砝码组合是一个首项为1公比为3等比数列,末项为 3 c o u n t − 1 3^{count-1} 3count1,则total= 3 c o u n t − 1 2 \frac{3^{count}-1}{2} 23count1

则当count=k+1时,第k+1个砝码的重量 weight = previousTotal * 2+1 = 3 c o u n t − 1 2 \frac{3^{count}-1}{2} 23count1 * 2 + 1 = 3 c o u n t 3^{count} 3count,此时砝码组合是一个首项为1公比为3的等比数列,末项为 3 c o u n t 3^{count} 3count

  • 85
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值