梅氏砝码问题
Posted liuyongliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了梅氏砝码问题相关的知识,希望对你有一定的参考价值。
例题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
处女座热爱做物理实验,为了实验,处女座必须要精确的知道物品的质量。处女座准备自己设计一套砝码,每一个砝码都是正整数,这套砝码必须能够精确测量出n以内所有正整数的质量,处女座想要知道至少需要多少个砝码。你可以在天平的任意一边放置砝码。
输入描述:
一行,一个正整数n
1<=n<=101000
输出描述:
一个整数,表示最少的砝码数。
示例1
说明
你可以选择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 }
高精度模板看这儿->>>>>>自家博客
以上是关于梅氏砝码问题的主要内容,如果未能解决你的问题,请参考以下文章