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 3 5 3 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<bits/stdc++.h>
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;
}