CF622D Solution

题目链接

题解

因为\(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;
}
原文地址:https://www.cnblogs.com/violetholmes/p/14393221.html