zoukankan      html  css  js  c++  java
  • 【HIHOCODER1527 】 快速乘法

    描述

    在写代码时,我们经常要用到类似 x × a 这样的语句( a 是常数)。众所周知,计算机进行乘法运算是非常慢的,所以我们需要用一些加法、减法和左移的组合来实现乘一个常数这个操作。具体来讲, 我们要把 x × a 替换成:(x<<a0) op1 (x<<a1) op2 (x<<a2) ... opn (x<<an) 这样的形式,其中opi 是+或者-。
    举个例子:x × 15 = (x<<4) - (x<<0)。
    在本题中,假设左移(包括左移0)和加法、减法所需要的时间都是一个单位的时间,上述的例子所需要的时间是3。
    现在给定常数 a 的二进制形式,求实现 x × a 最少需要多少单位的时间。

    输入

    一个01串,表示 a 的二进制形式,从左到右分别是从高位到低位。
    0 < 01串的长度之和 ≤ 106。
    a > 0。

    输出

    输出一个数,表示最小需要多少单位的时间可以实现 x × a。

    样例输入

    1111

    样例输出

    3

    题解

    存在两种决策
    (1)((10000)_2)((1111+1)_2)组成
    (2)((11111)_2)((1000000-1)_2)组成
    那么重要记录着两种决策,一直选择最优的即可。
    这个问题的具体论述:二幂拆分问题

    参考代码

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define inf 30005
    using namespace std;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void Out(ll a){
        if(a<0) putchar('-'),a=-a;
        if(a>=10) Out(a/10);
        putchar(a%10+'0');
    }
    const int N=1000005;
    char ch[N];
    int main()
    {
        while(~scanf("%s",ch)){
    	   int len=strlen(ch),l,r;
           for(l=0;l<len&&ch[l]=='0';l++);
           for(r=len-1;r>=0&&ch[r]=='0';r--);
           int u=1,d=1;
           for(int i=r-1;i>=l;i--){
              if(ch[i]=='1') u=min(u,d)+1;
              else d=min(u,d)+1;
           }
           Out(u*2-1);
           puts("");
        }
        return 0;
    }
    
    
  • 相关阅读:
    HDU 1015(字符运算 **)
    IOS7中自动计算label的宽度和高度的方法
    IOS开发UI基础文本属性Attributes
    IOS开发UI基础UIControl事件
    IOS开发UI基础UIImagePickerController的属性
    IOS开发UI基础UITableView的属性
    IOS开发UI基础UIActivityIndicatorView的属性
    IOS开发UI基础 UIAlertView的属性
    IOS开发UI基础UIImageView属性属性
    IOS开发UI基础 UIDatePicker的属性
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/7171756.html
Copyright © 2011-2022 走看看