XTU1254 Blance 如何实现称出1∼n 克的物品,请问最少需要几颗砝码?

题目描述

小明有一架天平,小明想称出1∼n 克的物品,请问最少需要几颗砝码?
比如小明想称出1∼4 克的物品,需要2颗砝码,为1和3克。
这里写图片描述

balance

输入

第一行是一个整数T(1≤T≤10000) ,表示样例的个数。 以后每行一个样例,为一个整数 (1≤n≤10 9 )。

输出

每行输出一个样例的结果。

样例输入

3
1
4
40

样例输出

1
2
4

证明一个定理(了解于知乎)

一、结论:
假设使用n+1个砝码,

对于每个n,可以称出的N的范围在

多于这个范围需要n=n+1,少于这个范围则只需要到n=n-1即可
对于题主提出的情况即为n=3,

二、应用:
对于任意N,根据(一)中闭区间的范围求出n值,即可得到所需求的砝码个数(n+1)。
假如N=6546587,求出log(6546587, base=3)~=14.2857, 即需要15个砝码,从1,3,9,27一直到3^14=4782969;由这15个砝码可以最多称出1-7174453中任何一个数字。

证明:
数学归纳法:
(1)对n=0,1,2,口算成立

(2)假设有k个砝码,可以称出不大于

的所有组合。

(3)那么加入第k+1个砝码:
我们可以看到

也即恰好为

的中间值,离两个端点的距离均为

而这个值正是(2)中k个砝码可以完美覆盖的数值范围

作者:周欣宇
链接:https://www.zhihu.com/question/30164499/answer/47003542
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

TIJIE:首先,放左面,放右面,和不放 有三种状态,把它想象成一个三进制问题;
即可以用1,3*3,3*3*3………等等来表示最少问题

下面给出AC代码:


#include <cstdio>
#include <iostream>

using namespace std;

int main(){
freopen();
    long long T,n;
    cin>>T;
    {
        while(cin>>n){
            long long ans = 0;
            long long t = 1 , sum = 0;
            while(sum<n){
                ans++;
                sum+=t;
                t*=3;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值