牛客寒假算法基础集训营2 C处女座的砝码-梅氏砝码问题

链接:https://ac.nowcoder.com/acm/contest/327/C
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
处女座热爱做物理实验,为了实验,处女座必须要精确的知道物品的质量。处女座准备自己设计一套砝码,每一个砝码都是正整数,这套砝码必须能够精确测量出n以内所有正整数的质量,处女座想要知道至少需要多少个砝码。你可以在天平的任意一边放置砝码。

输入描述:
一行,一个正整数n

1<=n<=101000
输出描述:
一个整数,表示最少的砝码数。

示例1
输入
20

输出
4

说明
你可以选择1,2,6,11
1=1
2=2
3=1+2
4=6-2
5=6-1
6=6
7=6+1
8=6+2
9=6+2+1
10=11-1
11=11
12=11+1
13=11+2
14=11+2+1
15=11+6-2
16=11+6-1
17=11+6
18=11+6+1
19=11+6+2
20=11+6+2+1
*用四个砝码称出1 - 40的重量,这四个砝码的值为多少?
若有n个砝码,重量分别为M1,M2,……,Mn,且能称出从1到(M1+M2+……+Mn)的所有重量,则再加一个砝码,重量为=(M1+M2+……+Mn)2+1,则这n+1个砝码能称出从1到(M1+M2+……+Mn+1)的所有重量。
解决思路 :
1克的法码是无论如何要用的;
其次需要准备的法码设为x克,就可以称x+1克和x-1克。由于x-1克是在1克的基础上继续加1克的重量所以 x-1=1+1 ,即 x=3 。根据上式可以称出 1、2=3-1、3、4=3+1克。
把要准备的第三个法码社为y克,由于第二个法码可以称到4克,所以又可以称y-4、y-3、y-2、y-1、y、y+1、y+2、y+3、y+4克的重量。由于y-4是在4克的基础上继续加1克的重量,所以 y-4=4+1。即 y=9。因此可以称出1、2=3-1、3、4=3+1、5=9-(1+3)、6=9-3、7=9+1-3、8=9-1、9、10=1+9、11=3+9- 1、12=3+9、13=1+3+9 。
再把要准备的第四个法码设为z克,可以称从z-13到z+13。和前面一样、z-13=13+1 ,所以 z=27。因此可以称出到40克的重量了。
也就是说、只要分别准备1、3、9(=3的平方)、27(=3的立方)克4种法码,就可以称出从1克到40克、每一次加1克的重量。

结论:若要称1到n,则需要的最少的砝码个数:
(3^m-1)/2>=n(等比数列求和)
即log3(2*n+1)向上取整

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#define LL long long
using namespace std;
int main()
{
   long double n;
   cin>>n;
   cout<<ceil(log(2*n+1)/log(3))<<endl;

   return 0;
}
原文地址:https://www.cnblogs.com/qinjames/p/10554695.html