Codeforces - 1152B - Neko Performs Cat Furrier Transform

地址

https://codeforces.com/contest/1152/problem/B

原文地址

https://www.lucien.ink/archives/422/

题意

给你一个 x x ,让你在 40 40 步之内把它变成 2 n 1 2 ^ n - 1 的形式,你一定会在奇数步将其异或上一个值 2 k 1 2 ^ k - 1 ,在偶数步将其自增 1 1 ,让你输出你需要花多少步,以及每次奇数步时的 k k 值。

题解

观察可得,每次将最高位的 0 0 置为 1 1 之后一定是最优的。

代码

https://pasteme.cn/6826

#include <bits/stdc++.h>
int x, ans[107], len;
bool check(int x) {
    x++;
    return (x & -x) == x;
}
int main() {
    scanf("%d", &x);
    int h = 28, step = 0;
    while (!(x >> h)) h--;
    while (!check(x)) {
        step++;
        if (step & 1) {
            for (int i = h; i >= 0; i--) {
                if (!((x >> i) & 1)) {
                    x ^= ((1 << (i + 1)) - 1);
                    ans[++len] = i + 1;
                    break;
                }
            }
        } else x++;
    }
    printf("%d\n", step);
    for (int i = 1; i <= len; i++) printf("%d%c", ans[i], i == len ? '\n' : ' ');
    return 0;
}
发布了382 篇原创文章 · 获赞 94 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/xs18952904/article/details/89506386