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

posted @ 2022-02-08 20:33  Bellala  阅读(41)  评论(0)    收藏  举报