梅氏砝码问题


梅氏砝码问题

例题

时间限制: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个砝码:1 可以称出:1
 则再加一个砝码,重量为=(M1+M2+……+Mn)*2+1    2个砝码:1,3 可以称出:1~4
  则再加一个砝码,重量为=(M1+M2+……+Mn)*2+1      3个砝码:1,3,9          可以称出:1~13
则再加一个砝码,重量为=(M1+M2+……+Mn)*2+1          砝码:1,3,9,27      可以称出:1~40
                           .
.
.
n个砝码:3^0,3^1...3^n 可以称出:1~(3^(n+1)-1)/2

n个砝码最大可以称出1~x的所有质量 ,x取值[(3^n+1)/2,(3^(n+1)-1)/2]


本题也就是求log3(2n-1)向下取整,用高精度

代码:
 1 /***********************************************/
 2 string div(string a,int b)//高精度a除以单精度b  
 3 {  
 4     string r,ans;  
 5     int d=0;  
 6     if(a=="0") return a;//特判  
 7     for(int i=0;i<a.size();i++)  
 8     {  
 9             r+=(d*10+a[i]-'0')/b+'0';//求出商  
10             d=(d*10+(a[i]-'0'))%b;//求出余数  
11     }  
12     int p=0;  
13     for(int i=0;i<r.size();i++)  
14     if(r[i]!='0') {p=i;break;}  
15     return r.substr(p);  
16 }  
17 const int L=100005;  
18 int na[L];  
19 string mul(string a,int b)//高精度a乘单精度b  
20 {  
21     string ans;  
22     int La=a.size();  
23     fill(na,na+L,0);  
24     for(int i=La-1;i>=0;i--) na[La-i-1]=a[i]-'0';  
25     int w=0;  
26     for(int i=0;i<La;i++) na[i]=na[i]*b+w,w=na[i]/10,na[i]=na[i]%10;  
27     while(w) na[La++]=w%10,w/=10;  
28     La--;  
29     while(La>=0) ans+=na[La--]+'0';  
30     return ans;  
31 }  
32 
33 string sub(string a,string b)//只限大的非负整数减小的非负整数  
34 {  
35     string ans;  
36     int na[L]={0},nb[L]={0};  
37     int la=a.size(),lb=b.size();  
38     for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0';  
39     for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0';  
40     int lmax=la>lb?la:lb;  
41     for(int i=0;i<lmax;i++)  
42     {  
43         na[i]-=nb[i];  
44         if(na[i]<0) na[i]+=10,na[i+1]--;  
45     }  
46     while(!na[--lmax]&&lmax>0)  ;lmax++;  
47     for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0';  
48     return ans;  
49 }  
50 
51 int main() 
52 {
53     string s;
54     cin>>s;
55     int ans=0;
56     s=mul(s,2);
57     s=sub(s,"1");
58     while(s!="0")
59     {
60         s=div(s,3);
61         ans++;
62     } 
63     cout<<ans<<endl;
64     return 0;
65 }
View Code

高精度模板看这儿->>>>>>自家博客

猜你喜欢

转载自www.cnblogs.com/liuyongliu/p/10316417.html
今日推荐