问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 �N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。
输入格式
输入包含一个正整数 N。
输出格式
输出一个整数代表答案。
样例输入
7
样例输出
3
样例说明
33 个砝码重量是 1、4、61、4、6,可以称出 11 至 77的所有重量。
1=1;1=1;
2=6−42=6−4(天平一边放 66,另一边放 44);
3=4−1;3=4−1;
4=4;4=4;
5=6−1;5=6−1;
6=6;6=6;
7=1+6;7=1+6;
少于 33 个砝码不可能称出 11 至 77 的所有重量。
评测用例规模与约定
对于所有评测用例,1≤N≤1000000000
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路
如果要称的重量为1,只能选择重量为1的砝码,1是必选的一个砝码
如果要称的重量大于1,那么再加砝码数,一定要选择一个能称的重量尽可能的大
选1、2,可以称1=1,2=2,3=1+2
选1、3,可以称1=1,2=3-1,3=3,4=1+3
选1、4,可以称1=1,2=?,3=4-1,4=4,5=1+4,不能称2,不符合题意
故两个砝码最大可以称4
选1、2、3,可以称1=1,2=2,3=3,4=1+3,5=2+3,6=1+2+3
选1、2、4,可以称1=1,2=2,3=1+2,4=4,5=1+4,6=2+4,7=1+2+4
……
选1、3、9,可以称1~13
故三个砝码最大可以称13
……
得,砝码有 n 个,最大可称max(n)=3*max(n-1)+1
代码
#include <iostream>
using namespace std;
int main()
{
int N;//要称的最大重量
cin >> N;
int i;
int sum = 0;
for (i = 1;;i++) {
sum = sum * 3 + 1;//计算i个砝码可以称的最大重量
if (sum >= N)
break;
}
cout << i;
return 0;
}