分析:
注意,虽然题目没有说,但稍加分析就知道,每个砝码只有1个,要不然光是重量为
1的砝码就能称出任意的重量
首先,如果要称的重量为1的话,只能选择重量为1的砝码,1是必选的一个砝码。然后再称比1重的,反正都是要再加砝码,那我们为何不选一个能称的重量尽可能大的呢
先考虑选用两个砝码,是否能称1~N连续的重量。
选1、2的砝码可以称重:1,2,1+2=3
选1、3的砝码可以称重:1,3-1=2(减相当于放在天平左边),3,3+1=4
选1、4的砝码可以称重:1,无法称2,不合题意
因此,如果只能选2个砝码,则选1和3,能称的重量最大,为4
当我们还需要再增加一个砝码时,按上述方法分析可得,选1、3、9的组合可以满足小于等于13(13=1+3+9)的所有重量
从中可以发现一个规律,当我们需要第三个砝码时,前两个砝码(1、3)满足的最大重量已经是4了,下一个要满足的重量是5,我们遵循砝码尽可能大的原则,选择的第三个砝码的重量满足的条件是:它减去“已经可以称得的最大重量”可以得到“下一个需要称的重量”。也就是weight-4=5,可得weight为9
按照这个规律,下一个选重量多少的砝码呢?13下一个是14,也就是27-13=14.27是3的立方。那么我们只要找到幂次,让输入的数位于3的这个幂次区间就行了
代码如下:
#include<iostream>
using namespace std;
int main()
{
int N; cin >> N;
//count:选用砝码的数量;weight:最重的砝码重量;mx;能称的最大重量
int count = 1,weight = 1,mx = 1;
while(mx<N)
{
count++;
weight*=3; //选用的砝码都是3的幂次
mx+=weight; //能称的最大重量就是3的幂次之和
}
cout << count << endl;
return 0;
}