題目鏈接:
http://codeforces.com/contest/622/problem/D
題目大意:
給出1~n的數字,每個數字出現2次。現在重新排列他們,使得能夠最小。
範圍:
n<=5*10^5。
思路:
對於n來說,有n-n=0,所以n的位置可以任意擺放。現在要使得s最小,我們就考慮構造一個序列,使得這邊的每一項都是0。
先對n進行分類:
1.n爲偶數的時候,對於1這類奇數來說,中間就有偶數個數,例如n=4時,就是1331,然後偶數的時候就是會多出一個數,就用n來補。
2.n爲奇數的時候,兩者反一下。
代碼:
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,k;
while(~(scanf("%d",&n)))
{
if(n%2){
for(i=1;i<=n/2;i++)
printf("%d ",2*i-1);
printf("%d ",n);
for(i=n/2;i>=1;i--)
printf("%d ",2*i-1);
for(i=2;i<n;i+=2)
printf("%d ",i);
for(i=n-1;i>=2;i-=2)
printf("%d ",i);
printf("%d\n",n);
}
else {
for(i=1;i<n;i+=2)
printf("%d ",i);
for(i=n-1;i>=1;i-=2)
printf("%d ",i);
for(i=2;i<n;i+=2)
printf("%d ",i);
printf("%d ",n);
for(i=n-2;i>=2;i-=2)
printf("%d ",i);
printf("%d\n",n);
}
}
return 0;
}