• 梅氏砝码问题



    梅氏砝码问题

    例题

    时间限制: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

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

  • 相关阅读:
    CSS 会被继承的属性
    List的遍历和删除元素
    java中unicode和中文相互转换
    Hibernate注解方式一对多自关联关系映射
    HQL: Hibernate查询语言
    java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。
    Java 将图片转二进制再将二进制转成图片
    返回上一页并刷新与返回不刷新代码
    Css圆角边框
    jquery mobile
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/10316417.html
Copyright © 2020-2023  润新知