CF359B Permutation

洛咕

题意:给定整数(n)(k),构造一个长度为(2*n)的排列,满足:(sum_{i=1}^{n}mid{a_{2i}-a_{2i-1}}mid-midsum_{i=1}^{n} a_{2i}-a_{2i-1} mid=2*k)

分析:一看到排列,就知道是要找性质了.首先不难发现如果排列正好是(1,2,....2*n-1,2*n),那么这个初始排列的贡献是0.

然后我们考虑交换相邻两项,可以发现式子(sum_{i=1}^{n}mid{a_{2i}-a_{2i-1}}mid)的值没有改变,而式子(mid sum_{i=1}^{n} a_{2i}-a_{2i-1} mid)的值变小了2,所以既然每交换(2*i-1)(2*i)就会产生2的贡献,我们就只要交换k次即可.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
int main(){
	int n=read(),k=read();
	for(int i=1;i<=n;++i){
		if(k){
			printf("%d %d ",2*i,2*i-1);
			--k;
		}
		else printf("%d %d ",2*i-1,2*i);
	}puts("");
    return 0;
}

原文地址:https://www.cnblogs.com/PPXppx/p/11533975.html