cf279 E. Beautiful Decomposition(贪心)
题意:
把一个二进制数 n 分解为2的幂的和或差:\(n=+/-2^{k_1}+/-2^{k_2}+\cdots +/-2^{k_m}\) ,\(k_i\) 可以有相同的。输出最小的 m
n以二进制形式输入,位数 \(\le 1e6\)
思路:
处理 \(010\)(单独一个1)需要1步
处理 \(01110\)(一段连续的1)需要2步:\(10000-00010\)
处理 \(01101110\)(两段连续的1,中间有一个0)需要3步。但如果中间有两个或以上的0就不如分开两段处理
步骤:把连续的两个或以上的1变成 \(1000\),直到没有连续的1。然后1的个数就是答案
string s;
signed main()
{
    cin >> s; s = "0" + s;
    int ans = 0;
    for(int i = s.size()-1; i; i--)
        if(s[i] == '1')
        {
            if(s[i-1] == '1') s[i] = '0', s[i-1] = '2';
            else ans++;
        }
        else if(s[i] == '2')
        {
            if(s[i-1] == '1') s[i] = '0', s[i-1] = '2';
            else ans++, s[i] = '0', s[i-1] = '1';
        }
    if(s[0] == '1') ans++;
    cout << ans;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号