题解
因为\(d_i>0,i-n\le 0\),为使\(|d_i+i-n|\)尽可能小,最好令\(d_i=n-i\)。如下构造可满足此条件:
对于与\(n\)奇偶相反的\(i\),\(\{...,i-2,i,i+2,...,n-1,n-1,...,i+2,i,i-2,...\}\);
对于与\(n\)奇偶相同的\(i\),\(\{...,i-2,i,i+2,...,n-2,n,n-2,...,i+2,i,i-2,...\}\)(此时\(d_i\)为偶数,中间需要一个\(n\)占位,因为\(n-n=0\),\(n\)的位置不影响答案)。将上述两序列接在一起,结尾添加另一个\(n\)即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int a[N],b1[N],b2[N];//b1:奇偶相反,b2:奇偶相同
int main()
{
int n,cnt1=0,cnt2=0;
scanf("%d",&n);
for(int i=1;i<n;i+=2) b1[++cnt1]=n-i;
for(int i=2;i<n;i+=2) b2[++cnt2]=n-i;
for(int i=cnt1;i>=1;i--) printf("%d ",b1[i]);
for(int i=1;i<=cnt1;i++) printf("%d ",b1[i]);
for(int i=cnt2;i>=1;i--) printf("%d ",b2[i]);
printf("%d ",n);
for(int i=1;i<=cnt2;i++) printf("%d ",b2[i]);
printf("%d",n);
return 0;
}