熟悉bitset

链接:https://ac.nowcoder.com/acm/contest/11217/A

来源:牛客网

dd在玩数字游戏,首先他拿到一个xxx
xxx不为零时进行如下操作
如果二进制xxx中有奇数个111,则xxx二进制形式下最低位取反(即000变成111,111变成000)
如果二进制xxx中有偶数个111,则xxx二进制形式下非前导零最高位取反
询问对于一个xxx,操作几次后变为零

函数

std::bitset<8> bits1;               // 默认初始化:00000000
std::bitset<8> bits2(42);           // 从整数初始化:00101010
std::bitset<8> bits3("10101010");   // 从字符串初始化:10101010

 

 

 

#include <bits/stdc++.h>
using namespace std;

int flipOperations(int x, int bitLength = 32) {
    bitset<32> bits(x); // 最多支持 32 位整数
    int steps = 0;

    while (bits.count() > 0) {
        int ones = bits.count();

        if (ones % 2 == 1) {
            // 奇数个 1 → 翻转最低位
            bits.flip(0); // 翻转最低位(不管原来是 0 还是 1)
        } else {
            // 偶数个 1 → 翻转最左边的 1
            for (int i = bitLength - 1; i >= 0; --i) {
                if (bits.test(i)) {
                    bits.reset(i);
                    break;
                }
            }
        }

        steps++;
    }

    return steps;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int x;
        cin >> x;
        cout << flipOperations(x) << endl;
    }

    return 0;
}

 

posted @ 2025-07-06 21:14  最近饭吃的很多  阅读(26)  评论(0)    收藏  举报