首页
比赛
tracker
题库
课程
竞赛讨论区
登录
/
注册
去牛客
首页
>
墨提斯的排列
7条解析
开通博客写题解
竹影孤峰寒
发表于 2026-02-11 12:13:44
题目解析 本题的核心是构造一个长度为 2n 的排列,使得相邻元素的按位异或值之和最小。要实现这一目标,关键在于利用格雷码(Gray Code) 的核心性质:相邻两个格雷码的二进制表示仅有一位不同。 由于两个数的按位异或结果等于其二进制不同位的权值之和,因此相邻数仅有一位不同时,单次异或结果最小(仅为
展开全文
枫林叶233
发表于 2026-02-11 21:45:01
题目 输入 输出 思路 要使相邻两项的异或值相加最小,就要相邻的数二进制尽可能相近,同时也要满足排列的性质。 0000 0001 0010 0011 在满足排列性质的前提下,发现只有两个数二进制异或完只剩下一个1的排序最小。 也就是答案构成格雷码。 格雷码第i项就是i^(i>>1)
展开全文
星满天呦
发表于 2026-02-10 13:58:55
题目题意: 给一个长度为2的n次方的排列,要求找到一组保证相邻两项异或值之和最小,并输出结果。 题目知识点: 构造、位运算 题目分析: 题目中提到的相邻两项异或值最小,本质是让相邻两个数的二进制差异最小,这个与格雷码中相邻两个数的二进制只有一位不同一致,所以其构造逻辑与格雷码相同,代码如下: #in
展开全文
wwww1__
发表于 2026-02-20 19:26:19
题意 最终排列本质就是格雷码 格雷码:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同; 所以我们可以用其性质就是上面的,通过贪心构造出最优排列。 #include<bits/stdc++.h> using namespace std; int main() { i
展开全文
我是无敌暴龙王
发表于 2026-02-16 20:04:38
要使两数异或值最小,即两数二进制的差异最小。 例如0000后为0001,0001后本应为0000,但0000在前面已出现过。 所以0001后为0010。 即0000——0001——0010——0011,与格雷码一致。 下面是代码: #include<bits/stdc++.h> #def
展开全文
听雨眠wc
发表于 2026-02-14 15:00:16
题目:墨提斯的排列 思路: 异或运算的性质决定了,两个数的二进制表示中,不同的位数越多,它们的异或值就越大。 因此,要最小化异或值之和,就需要让排列中相邻的两个数在二进制表示下只有一位不同。 满足这一性质的序列,正是格雷码(Gray Code)。 代码: #include <bits/stdc
展开全文
092325103陈鹏
发表于 2026-02-17 02:48:59
首先,^最小是1,怎么样才能是1呢,一定是两个数字仅仅1位不一样,比如(1,0) 、(10,11);但是未必所以都能满足1,不过即使不能满足1,如10,100也是相对于(11,110)而言比较小的,所以一位不同这一点保留,另外如果a^b=c,那么c^b=a,原因的话,^是相同为0,不同位1,假设第
展开全文
查看本题
查看本题讨论
等你来战
查看全部
牛客练习赛150
报名截止时间:2026-03-27 21:30
“⌬杯”蓝桥杯大赛省赛模拟赛
报名截止时间:2026-03-29 17:00
牛客周赛 Round 137
报名截止时间:2026-03-29 21:00
牛客2026年愚人节比赛
报名截止时间:2026-04-01 21:00
牛客挑战赛87
报名截止时间:2026-04-03 22:00
华中农业大学第十五届程序设计竞赛(同步赛)
报名截止时间:2026-04-04 15:30
扫描二维码,关注牛客
意见反馈
下载牛客APP,随时随地刷题