首页 > 墨提斯的排列
头像 竹影孤峰寒
发表于 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,假设第 展开全文

等你来战

查看全部