CodeForces - 622D Optimal Number Permutation 构造

题目链接

思路:

 .

很水的造,要使s最小,由于其它值是确定的,只需要使di+i-n的值为0即可,即两个相同的数相距n-i.

由于填数的时候可能会出现对应的位置上已经填数了,所以我就把2*n长度的数划分为两半,左面填奇数的,

右面填偶数的这样就不会重复可.自己填一下就知道了.

#include
using namespace std;
const int maxn=1e5+10;
int a[10*maxn];
int n;
int main()
{
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	int lo=1,le=n+1;
	for(int i=1;i<=n-1;i++)
	{
		if(i&1==1)
		{
			a[lo]=a[lo+n-i]=i;
			while(a[lo]!=0)
			lo++;
		}
		else
		{
			a[le]=a[le+n-i]=i;
			while(a[le]!=0)
			le++;
		}
	}
	for(int i=1;i<=2*n;i++)
	{
		if(a[i]==0)
		printf("%d ",n);
		else
		printf("%d ",a[i]);
	}
	return 0;
}

你可能感兴趣的:(codeforces,各种构造)