You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求异或为X的N个自然数数组:最小和及字典序最优解

嘿,我来帮你理清这个问题的正确解法,你的思路确实踩了一个关键的误区——当N是偶数时,没必要硬塞N-1个1,换一种拆分方式能得到更小的总和,同时还能满足字典序要求。咱们一步步拆解:

核心目标:先保证总和最小,再追求字典序最小

首先明确题目里的自然数是正整数(从示例用1而非0就能看出来),我们的目标是构造N个正整数,异或结果为X,总和尽可能小,若有多个解则选字典序最小的(前面的元素越小越好)。

情况1:N=1

这是最简单的情况,唯一解就是[X]——只有一个元素,异或结果必然是它本身,总和也没法更小。

情况2:N是奇数

这个你的思路是对的:构造N-1个1(偶数个1的异或结果是0),再加上X。这样数组的异或结果是0 ^ X = X,完全符合要求,总和是(N-1) + X。因为1是最小的正整数,这个总和已经是最小的了,而且前面全是1,字典序也自然是最小的。比如示例N=3,X=2,输出[1,1,2]就完美符合这个逻辑。

情况3:N是偶数

这里是你之前出错的地方,分两种子情况讨论:

子情况3.1:X≠1

我们可以换一种构造方式:放N-2个1(偶数个,异或结果为0),然后找两个正整数ab,满足a ^ b = X,且a + b尽可能小。

怎么找这样的a和b?
根据异或的性质:a + b = (a ^ b) + 2*(a & b)。要让a + b最小,就得让a & b = 0(也就是a和b的二进制位没有重叠),此时a + b = X,这是最小的可能和。

找a的技巧:选X二进制中最低位的1对应的数值,比如:

  • X=6(二进制110),最低位的1是210),那a=2,b=6^2=4(100),此时2^4=6,且2+4=6,完美。
  • X=5(二进制101),最低位的1是11),a=1,b=5^1=4,1^4=51+4=5

构造出来的数组就是[1,1,...,1,a,b](前N-2个1,接着a,最后b),总和是(N-2) + X,比你之前用N-1个1加1^X的总和更小(比如N=4,X=6时,前者总和是2+6=8,后者是3+7=10)。而且因为前面全是1,a又是最小的可能值,字典序也是最小的。

如果X是奇数(比如X=3),a=1,b=2,构造的数组是[1,1,...,1,1,2],这和你之前用N-1个1加1^3=2的数组是一样的,总和相同,字典序也最小。

子情况3.2:X=1

这是个特殊情况:因为要找两个正整数a和b满足a^b=1a&b=0的话,只能是1和0,但0不是正整数,所以没法用上面的方法。

这时候我们只能退而求其次,找和最小的两个正整数满足异或为1——也就是2和3(2^3=1),总和是5。构造的数组就是[1,1,...,1,2,3](前N-2个1,接着2,最后3),这样既满足异或为1,总和最小,同时前面全是1,字典序也最小。

验证你的错误案例

你提到的N=4,X=6:
按照正确方法,前N-2=2个1,加上a=2,b=4,得到数组[1,1,2,4],异或结果是1^1^2^4=0^6=6,总和8,确实比你之前的[1,1,1,7]总和10小,而且字典序也更小。

最终步骤总结

  1. 若N=1:输出[X]
  2. 若N是奇数:输出N-1个1 + X
  3. 若N是偶数:
    • 若X=1:输出N-2个1 + 2 + 3
    • 否则:找到X二进制最低位的1对应的数a,计算b=X^a,输出N-2个1 + a + b

内容的提问来源于stack exchange,提问作者Klasen

火山引擎 最新活动