给出n,让你用1,2,3,4,....n,1,2,3,....n一共2n个数构造一个序列使得
sum . 最小
猜测一下要用 di 和n-i越接近越好。。。没想到居然是可以全部完全相等的。。。
也就是:
1之间要有n-2个数
2之间要有n-3个数
3之间要有n-4个数
...
n-1之间要有0个数
n由于n-n=0;n之间可以有任意个数;
我们先构造一段数列
我们发现,n-1这一对之间有0个数,放在一起,
n-1-2这对之间有2个数,把n-1夹在中间,
以此类推,一直把全部数都夹在中间
接下来另起一段数列,是对中间只能夹奇数个数的 对 处理,
n-2这对夹着一个数,我们把n放进去,
接下来n-2-2这对夹着3个数,我们把它们夹在新数列两端,以此类推,、
最后只剩下一个n,丢在最后面即可
3
2 2 1 3 1 3
4
1 3 3 1 2 4 2 4
5
2 4 4 2 1 3 5 3 1 5
6
1 3 5 5 3 1 2 4 6 4 2 6
由此:写出三部分即可。。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int inf=2147483647;
const double pi=acos(-1.0);
double eps=0.0000010;
int tm[1000000];
int main()
{
int n;
cin>>n;
int tt=n-1;
int i;
int ok=0;
if (tt%2) i=1;
else
i=2;
for (;i<=tt;i+=2)
tm[++ok]=i;
for (i=tt;i>=1;i-=2)
tm[++ok]=i;
if (tt%2) i=2;
else i=1;
for (;i<=n;i+=2)
tm[++ok]=i;
for (i=n-2;i>0;i-=2)
tm[++ok]=i;
tm[++ok]=n;
for (i=1;i<=2*n;i++)
{
if(i!=1) printf(" ");
printf("%d",tm[i]);
}
printf("\n");
return 0;
}