Educational Codeforces Round 7--D. Optimal Number Permutation

D. Optimal Number Permutation

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

You have array a that contains all integers from 1 to n twice. You can arbitrary permute any numbers in a.

Let number i be in positions xi, yi (xi < yi) in the permuted array a. Let's define the value di = yi - xi — the distance between the positions of the number i. Permute the numbers in array a to minimize the value of the sum .

Input

The only line contains integer n (1 ≤ n ≤ 5·105).

Output

Print 2n integers — the permuted array a that minimizes the value of the sum s.

Sample test(s)
input
2
output
1 1 2 2
input
1
output
1 1
唉,比赛没有想出来。
不过第二天又分析了下,感觉有规律,最后果真是找规律题目。
首先,这个sum和最小值是可以为0的,对于任何n来说都可以为0。
式子前面是一个n-i 说明i = n时这个数一定是0,式子后面是di - i + n,若这个式子为0,则di = n - i,综上,除了i = n以外,只要凑出di = n - i即可!而对于i = n来说,这两个数随便放即可!
规律:不好说 自己观察吧:
奇数时:
n = 3: 1 3 1 2 2 3
n = 5: 1 33 1  2 4  4 2 5
n = 7: 1 3 5 7 5 3 1 2 4 6 6 4 2 7
n = 9: 1 3 5 7 9 7 5 3 1 2 4 6 8 8 6 4 2 9
偶数时:
n = 4:   1 3 3 1  2 4 2 4
n = 6:   1 3 5 5 3 1  2 4 6 4 2 6
n = 8:   1 3 5 7 7 5 3 1  2 4 6 8 6 4 2 8
规律很明显了:
代码如下:
#include
using namespace std;
const int maxn = 200005;
int last[maxn],a[maxn];
int main()
{
    int n;
    while(cin >> n){
        if (n%2==0){
            for (int i = 1; i <= n; i+=2)printf("%d ",i);
            for (int i = n-1; i >= 1; i-=2)printf("%d ",i);
            for (int i = 2; i <= n; i+=2)printf("%d ",i);
            for (int i = n-2; i >= 1 ; i-=2)printf("%d ",i);
            printf("%d\n",n);
        }else{
            for (int i = 1; i <= n; i+=2)printf("%d ",i);
            for (int i = n-2; i >=1; i-=2)printf("%d ",i);
            for (int i = 2; i <= n-1;i+=2)printf("%d ",i);
            for (int i = n-1; i >= 1;i-=2)printf("%d ",i);
            printf("%d\n",n);
        }
    }
    return 0;
}


你可能感兴趣的:(CodeForces,数学)