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); } } }