CF92B-Binary Number-(思维)

https://vjudge.net/problem/CodeForces-92B

题意:给一个长度为106的二进制数,有两种操作,第一种是除以2,第二种是末尾+1,以二进制运算,问这个二进制数最少几次操作后变成1。

思路:如果末尾是0,则是偶数,可以除以2,消去一个0;如果末尾是1,则是奇数,需要加1变成偶数,这样在末尾会产生一个0,并且左边会进位生出一个1。如果有一段连续的1,则会在连续1的左边生出一个1,连续的1串会变成0,逐个消掉就好了。

mport java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;

public class Main{
    
    public static void main(String []args) {
        Scanner scan=new Scanner(System.in);
        String s;
        char [] a=new char[1000086];
        
        while(scan.hasNext()) {
            s=scan.next();
            s="0"+s;
            a=s.toCharArray();
            int len=s.length();
            int ans=0;
            for(int i=len-1;i>1;) {
                if(a[i]=='0') {
                    ans++;
                    i--;
                }else {
                    ans++;//+1操作
                    int num=0;//计数有多少个连续的1
                    while(a[i]=='1') {
                        num++;
                        i--;
                    }
                    ans=ans+num;//进位后都变成0,每个0需要一次除2操作
                    a[i]='1';//连续1前面的那一位被进位成1
                }
            }
            System.out.println(ans);
        }
    }

}
posted @ 2019-12-20 22:11  守林鸟  阅读(179)  评论(0编辑  收藏  举报