题意
给定一个正整数 \(n\),现在有一个变量 \(k\),初始值为 \(0\),请你构造一个 \(1\sim n\) 的排列 \(p_i\),使得从下标 \(1\) 开始经过 \(n\) 次操作得到的变量 \(k\) 最大。操作具体为:如果当前下标 \(i\) 为奇数,那么 \(k\) 与上 \(p_i\);否则 \(k\) 或上 \(p_i\)。
Solution
Step 1:证明答案与 \(n\) 的关系
一开始把或看成了异或写了好久。 样例还是很良心,给了 \(n\) 在 \(5\sim 10\) 的答案,而 \(n=11\) 的答案是 \(11\),因此猜测我们的答案在 \(n\) 为奇数时是 \(n\),否则答案为 \(n\) 的位数的 \(2\) 的幂减 \(1\)。然后证明一下,当 \(n\) 为奇数时,最后一次操作为与,而任何一个数与上 \(x\) 都会小于等于 \(x\)。因此答案小于等于 \(n\)。而 \(n\) 为偶数时,我们的答案最多只能将所有位上的数变成一,所以答案为 \(n\) 的位数的 \(2\) 的幂减一。所以我们如果能构造出这样的序列,那么其结果肯定是最大的。
Step 2:分析序列构造
首先考虑从 \(n\) 的奇偶性质分析。
若 \(n\) 为奇数,考虑将最后一位放置 \(n\),这样能够保证我们可得到的最大值最大。然后考虑将 \(1\sim n-1\) 经过操作变成 \(n\)。由于 \(1\) 或上 \(n-1\) 等于 \(n\),所以可以构造排列的末尾为 \(1,n-2,n-1,n\) 使得结果为最大。无论前面经过什么操作,进入这个末尾时,或上 \(1\),最后一位肯定是 \(1\),然后与上 \(n-2\) 这个奇数,肯定能保证最后一位是 \(1\)。然后或上 \(n-1\),所得结果是 \(n\),然后 \(n\) 与上 \(n\) 能够保证最终结果是 \(n\)。
若 \(n\) 为偶数,那么最后一次操作是或,若 \(n\) 的二进制下的位数是 \(s\),那么考虑在最后一位放上 \(2^{s-1}-1\),这样可以保证最后一次或操作能够使 \(1\) 经可能的多。但是还有首位上的 \(1\) 没有考虑,所以考虑倒数第二位放上 \(n\),这样 \(n\) 或上 \(2^{s-1}-1\) 等于 \(2^s-1\)。为了与上 \(n\) 能够保留最高位的 \(1\),我们希望倒数第三位放上 \(n-1\),但是 \(n\) 可能是 \(100\dots 00\) 形式的,这样 \(n-1\) 最高位是 \(0\),所以末尾是 \(n-1,n,2^{s-1}-1\) 是当 \(n\) 不为二的幂时。
而当 \(n=2^{s-1}\) 时,还是考虑最后两位是 \(n,n-1\),这样 \(n\) 或上 \(n-1\) 等于 \(2^s-1\)。然后考虑用前面的数凑出 \(n\),保证 \(n\) 与上 \(n\) 是 \(n\),考虑末尾是 \(1,n-3,n-2,n,n-1\),这样 \(1\) 与上 \(n-3\) 末尾肯定是 \(1\),然后在 \(1\) 或上 \(n-2\) 等于 \(n\),这样就完成了构造。
Step 3:归纳与总结
综上:当 \(n\) 为奇数时,末尾构造 \(1,n-2,n-1,n\);当 \(n\) 为偶数且 \(n≠2^s\) 时,末尾构造 \(n-1,n,2^{s-1}-1\);当 \(n\) 为偶数时且 \(n=2^s\) 时,末尾构造 \(1,n-3,n-2,n,n-1\)。
Step 4:代码展示
#include<bits/stdc++.h>
using namespace std;
int t,n;
int main(){
cin>>t;
while(t--){
cin>>n;
if(n&1){
cout<<n<<endl;
for(int i=1;i<=n-4;++i) cout<<i+1<<" ";
cout<<1<<" "<<n-2<<" "<<n-1<<" "<<n<<endl;
}else{
int k=log2(n);
cout<<int(pow(2,k+1))-1<<endl;
if(int(pow(2,k))==n){
for(int i=1;i<=n-5;++i) cout<<i+1<<" ";
cout<<1<<" "<<n-3<<" "<<n-2<<" "<<n-1<<" "<<n<<endl;;
}else{
for(int i=1;i<=int(pow(2,k))-2;++i) cout<<i<<" ";
for(int i=int(pow(2,k));i<=n-2;++i) cout<<i<<" ";
cout<<n<<" "<<n-1<<" "<<int(pow(2,k))-1<<endl;
}
}
}
return 0;
}
浙公网安备 33010602011771号