您的位置:首页 > 运维架构

cf#ecr7-D - Optimal Number Permutation-构造+脑洞

2016-02-14 14:56 465 查看
给出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;
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: