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

给出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  

1 3 3 1  2 4 2     4 

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;
	
}




你可能感兴趣的:(cf#ecr7-D - Optimal Number Permutation-构造+脑洞)