问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 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 的所有重量。
评测用例规模与约定
对于所有评测用例,1≤N≤1000000000
运行限制
-
最大运行时间:1s
-
最大运行内存: 512M
分析:(贪心算法)
注意根据例子可知:砝码表示表示的重量必须是连续的!!!
一个砝码:最大区间为[1,1],最大只能表示1,表示不了2。所以这一个砝码只能是重量1;
两个砝码:最大区间为[1,3](如果是[1,4],就没法表示出2,及4-1=3,所以两个砝码能表示的最大区间为[1,3]),最大只能表示4,表示不了5。所以这两个砝码的重量为1和3;
三个砝码:(最大区间为[1,x],虽然x我们还不知道,但我们已经知道肯定有重量为1和3的砝码,即4(包括4)之前的重量已经可以用两个(最少的砝码个数)表示出来了,所以相当于此时范围变为了[4,x],又因为如果x = 10,怎表示不了5了,所以x最大取到9,用数学表达式表示就是:x-(1+3)=5 -----> x = 9)最大区间为[1,9].........;
......................
可以发现最大区间的上顶总是3的倍数。
由此可以总结出:一个砝码最大可以表示值:1(3^0)
两个砝码最大可以表示值:1+3(3^1)
三个砝码最大可以表示值:1+3+9(3^2)
..............
所以,显而易见了:我们可以设一个值,如MAX,来表示最少砝码可以表示的最大值,然后将MAX与输入的值做比较,如果MAX>输入的值,则输出该MAX对应的砝码数量即可。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int N;
int max = 0;
int count = 0;
scanf("%d",&N);
while(1){
if(max>=N) break;
max += pow(3,count);
count++;
}
printf("%d",count);
return 0;
}