蓝桥杯题目(最少砝码)

一些废话:

        这道题目我第一次做的时候当然是不会做滴,所以你也不要怕,希望这篇文章对你有帮助。我其实是在这里搜了好多相关文章,也上网查了,官方视频也看了(当然大多都是屁话,代码都懂,他就是不讲原理),但那些我感觉自己都看不懂(太菜了)。在我这里要用一种叫平衡三进制的概念,下面我会大致介绍一下(不难理解)。

        另外这道题的样例是一个很大的坑(并不是说给的答案错了),在你找规律的时候阻止你前进。如果你只想靠找规律解决这题,我可以给你找出标准规律的样例,这也是最简单的方法:这3个砝码的重量分别是1、3、9.

        如果你想知道为什么是这三个数,那就往下看。

问题描述

我们先来看一下题目(这是蓝桥杯每日一练的题目)

最少砝码

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

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

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

输入格式

输入包含一个正整数 N。

输出格式

输出一个整数代表答案。

样例输入

7

输出

样例说明

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 个砝码不可能称出 11至 7​ 的所有重量。

评测用例规模与约定

        对于所有评测用例,1 ≤ N ≤ 1000000000

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

代码展示:

#include<stdio.h>
int main()
{
    int target;
    scanf("%d",&target);
    int sum=1;
    int count=1;
    while(sum<target)
    {
     sum+=Math.pow(3,count);
     count++;
    }
    printf("%d",count);
return 0;
}

思路:

     1.先换一种简单题目理解:

        我们先把题目加一个限制条件:你准备的这些砝码,只能在一端进行放置并进行之后的称重(原来的题目是可以两边都放的,所以你们感觉会复杂),那么现在我们的砝码就只有两种情况了:一种是放在了天平上进行称重(加本身砝码重量),另一种就是闲置状态(没用上,加0)。所以如果我们有砝码n个,那么就会有2^n种情况,组成了2^n个数字。这时如果我是让你找出能称出100以内所有数的最少砝码,就必须要满足这一种情况:2^n>=100。这里指的是2^n个数据一定要大于100,否则就算你这些2^n个数据全在100以内,那也是不够的。

如果完成了这个条件之后,我们就要思考有没有一种可能:2^n正好等于100,且这些数字全部都在100范围内。这就是我们要找的最少砝码的情况,(当然这里的100并不是一个很好的例子,你可以换做32来理解)

        此时我强制你回忆一下计算机的2进制,(我们把n当作2进制中的位数)是不是就跟这种情况一模一样:

        2进制计算总值就是:每一位的权重*每一位数字的和,那么它所能表示的数值都是从0开始一直到2^n-1个。

        2进制的每一位只有两种情况分别是1和0,计算总指时也是拿这些×每一位的权重,这不就正好对应了砝码的两种情况(前面讲过)。

        再将二进制的权重和砝码的重量对应。

你现在已经找到了最少砝码数的情况(每一个砝码的重量),这道题目不就是让你求最少砝码数嘛,一个简简单单的加法绝对难不倒你,这里我就不说了。

        他所能表达的区间就是0~1+2+……+2^(n-1);

      2.试着把这种思路转回到原题目:

        此时,我们再来看一下原题,原题砝码放置的情况实际上也就增加了一种:放在称重物品的一端(减本身砝码的重量)。其余两种情况分别是1.闲置2.在没有放置物品的一段

        那么此时你绝对会想用三进制来模拟这种情况,但很可惜是不能的,下面告诉你原因:在上面的思考中,二进制的每一位的情况是1和0能准确的代表那两种情况,也能在计算二进制总和时准确地与权重相乘(对应的就是砝码个数*砝码重量)。但在三进制里面,三进制每一位确实也有三种情况:0、1、2,我们可以把它对应到砝码放置的情况(蓝色部分),前两种情况(0、1)在对应“计算三进制总和时”确实也能对应到。但对于2来说,在三进制中它并不能代表“减去这个位数的权重”,它本身指的是2*这个位数的权重,对应到砝码中指的就是“两个一样重的砝码相加”。

        如果上面的内容你看懂了再来看接下来的蓝字部分,如果没有请跳过(这会让你更迷):如果你很倔强,因为三进制也可以表示出“从0开始一直到最后你想要的n”其中的所有数(并且也没有浪费任何一个数据)。那么你有想过一下这种要求吗:在你表示8的时候换算成三进制就是22,那么现在也就是需要4个砝码,但此时其实最少的砝码数就是3,砝码重量分别是(1、3、9).汗流浃背了吧,这就是你硬要把三进制中的三种情况对应到砝码称重中去。

3.平衡三进制的引入:

介绍平衡三进制:

        平衡三进制和传统的三进制一样每一位都有一样的权重,不同的是他的每一位的情况变成了(-1,0,1)

        其实知道这些就已经够了,我再考考你:平衡三进制-111是多少??????为5。那-1-11呢???????为-11。

        那么一般的平衡二进制的最小值就是-1-1-1-1.……最大值就是1111……        

        思路:

        了解完上面的两种思路后,你是否有点不甘心:明明三进制的情况马上就要对上砝码称重的情况了。想过没:有没有一种三进制:三种情况都与砝码称重一一对应。还真的有!!!!平衡三进制。

        如果用平衡三进制的话,他就能将每一位的3种情况(-1,0,1)对应到称重中,-1就是在物品的一端放一块砝码,0就是闲置,1就是在物品另一端放置一块砝码。那现在所有问题不就引刃而解了,即每次选则的砝码都是3^0,3^1,3^2……

那他所能表达的区间就是-(1+3+9……+3^(n-1))~~1+3+9……+3^(n-1).

但在这里我们用不到负数的情况,所以还是从零开始的区间,如果你担心负数的情况是多余的就看下面蓝色部分(如果不是就别看,容易迷):就比如最小的那个负数对应的不就是所有砝码都放在物品一端的情况嘛,只不过我们正常情况下不会那么做。

         

总结:

        到最后就已经的到了以一个重要信息:我们所要找的最小砝码数中砝码的重量依次是(1,3,9,27……),如果:这些砝码数总量加起来(区间的最大值,能称重的最大值)<物品重量,就循环添入下一个砝码n+1(重量为3^n),直到大于物品重量为止,用一个专门计数砝码数量的变量在循环里面,每添加一个砝码就加一,也就是每循环一次加一。

题外话:

        我在博客上翻,在浏览器上找,他们讲的大多不容易理解(对我来说,可能我太菜了),官方的视频是靠这个数学真理计算的,感兴趣的可以去看看

链接:
用户登录

用平衡三进制解决是我感觉最简单的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奈奈朵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值