题解 | #格雷码#

附加题Ⅰ

https://ac.nowcoder.com/acm/contest/17942/I

思路:
预处理出所有2的次幂的答案
显然有如下递推式:

void init() {
    sz[0] = 1;
    for (int i = 1; i <= 32; i++) {
        sz[i] = 2 * sz[i - 1] + 1;
    }
}

其实sz[i]的本质含义是在0-i-1位都是0的情况,翻转第i位(可能是0变1,也可能是1变0)的最少操作次数

考虑输入的数其二进制表示中“1”的奇偶性。
不妨来看2个例子(下列数为二进制表示):
100100, 1000100100
我们发现,前一个例子中,在翻转100000的过程中,会出现100100这一步(即相当于翻转了第2位)(感兴趣的朋友可以认真推推我们是怎么预处理2次幂答案,怎么有那个递推式的)
所以100100的答案为 翻转第5位的答案 - 翻转第2位的答案
而第二个例子:
1000100100
在翻转1000000000的过程中,会出现1000100000这一步,而1000100000这一步则相当于1000100100翻转了第2位。
所以答案为 翻转第2位的答案 + 翻转9位的答案 - 翻转第5位的答案。
一般的,我们记录输入数二进制表示中1的个数。
若为奇数,则在二进制表示中,从右往左枚举出现1的位数,依次为+答案 -答案 +答案......
反之则为-答案 +答案 -答案.......
代码如下:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll sz[32]; 
void init() {
    sz[0] = 1;
    for (int i = 1; i <= 32; i++) {
        sz[i] = 2 * sz[i - 1] + 1;
    }
}
ll n;
ll cnt;
ll tmp;
ll arr[32];
ll ans;
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    init();
    cin >> n;
    while (n) {
        if (n & 1) {
            arr[++cnt] = tmp;
        }    
        tmp ++;
        n >>= 1;
    }
    if (cnt & 1) {
        for (int i = 1; i <= cnt; i += 2) {
            ans += sz[arr[i]];
        }
        for (int i = 2; i <= cnt; i += 2) {
            ans -= sz[arr[i]];
        }
    }
    else {
        for (int i = 2; i <= cnt; i += 2) {
            ans += sz[arr[i]];
        }
        for (int i = 1; i <= cnt; i += 2) {
            ans -= sz[arr[i]];
        }        
    }
    cout << ans << "\n";
    return 0;
}
全部评论

相关推荐

昨天 00:04
已编辑
吉林大学 Java
约面的挺突然。。狠下心接了1.自我介绍2.讲讲JAVA的反射3.可以继续讲讲AOP,动态代理[&nbsp;因为讲反射不小心吟唱到了例如AOP的动态代理,但是这块记忆的非常不熟,结果磕磕绊绊&nbsp;]4.项目我看你写了AOP和注解,具体怎么实现滑动窗口限流的[&nbsp;梦到什么说什么,吟唱八股发散千万不要散到自己不熟悉的区域&nbsp;]5.也讲讲为什么另一个项目选择令牌桶,具体流程6.&nbsp;OK,讲讲&nbsp;Redis&nbsp;的数据类型?还有吗?就了解这五种嘛[&nbsp;把5个的基础类型从应用对比到历届底层全都吟唱了一遍。一句还有吗直接没力气了,简历就写了理解5种,别的我是真一点没看TT&nbsp;]7.讲讲Redission分布式锁实现8.这个指数退避怎么实现的9.在这里有考虑去保障幂等性嘛10.这里为什么使用指数退避呢?&nbsp;什么时候用均匀重传[已经晕过去了说不了解,刚说了后就意识到,估计应该说指数退避能缓解压力防止下游服务器雪崩之类的]11.ok,那讲讲JMM12.讲讲RocketMQ如何保证的不丢消息13.讲讲RocketMQ延迟消息原理14.讲讲项目Redis实现会话记忆这一块15.如果ai调用function&nbsp;calling出现幻觉,有考虑怎么解决吗?[&nbsp;不了解,面试官说什么接口幂等化,高危操作人工防护,没在听,感觉人已经飞升了TT&nbsp;]16.mcp了解嘛?和function&nbsp;calling有什么区别[&nbsp;依旧不了解,只能说了个前者规范架构抽象解耦,后者耦合高只能算个工具调用]17.AI生成代码的代码质量怎么保障,那平时如何review的呢18.算法。lc215&nbsp;&nbsp;数组中最大第k个元素19.打算考研还是本科就业20.反问1️⃣有哪里不足,有哪些需要提高的部分。[主要说知识广度不够,多刷算法,让我别太紧张]2️⃣部门业务会做什么人生第二次面试。感觉大厂面试官的气场压力很大应该凉了不过这次面试非常锻炼心态,多面试,多面试。
Luxlord:面经太硬核了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务