CF359B Permutation

题目

给出整数 n n n, k k k

构造一个长度为 2 × n 2 \times n 2×n 的序列 a a a

满足:
∑ i = 1 n ∣ a 2 i − a 2 i − 1 ∣ − ∣ ∑ i = 1 n a 2 i − a 2 i − 1 ∣ = 2 k \sum_{i=1}^n |a_{2i} -a_{2i-1}| -|\sum_{i=1}^n a_{2i}-a_{2i-1}| = 2k i=1na2ia2i1i=1na2ia2i1=2k

1 ≤ n ≤ 50000 1≤n≤50000 1n50000 , 0 ≤ 2 k ≤ n 0≤2k≤n 02kn

思路

首先,发现当 k = 0 k=0 k=0 时,一组符合要求的解为:

1 , 2 , 3 , … , n {1,2,3,…,n} 1,2,3,,n

那我们能否只改变序列中任意相邻的两组数来使该式符合要求呢?

可以!因为题目里说 2 k ≤ n 2k≤n 2kn , 而 a 2 i a_{2i} a2i a 2 i + 1 a_{2i+1} a2i+1 每交换一次差都会增加 2 2 2

于是,我们就做出了这道题。

时间复杂度 O ( 2 ∗ n ) O(2*n) O(2n)

CODE:

#include<bits/stdc++.h>
using namespace std;
int n,k,a[100005];
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=2*n;i++)
		a[i]=i;
	for(int i=1;i<=2*n;i+=2)
		if(k>0)
			swap(a[i],a[i+1]),k--;
	for(int i=1;i<=2*n;i++)
		printf("%d ",a[i]);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值