查找2N个数字的排列,以使给定表达式的结果在C ++中恰好为2K
假设我们有两个整数N和K。我们必须找到2N个自然数的第一个置换,以便满足以下方程式。
$$\displaystyle\sum\limits_{i=1}^N\lvertA_{2i-1}-A_{2i}\rvert+\lvert\displaystyle\sum\limits_{i=1}^NA_{2i-1}-A_{2i}\rvert=2K$$
K的值应小于或等于N。例如,如果N=4且K=1,则输出将为2134。给定表达式的结果将为(|2–1|+|3–4|)–(|2–1+3–4|)=2。
这个想法很简单,考虑一下我们有一个排序后的序列,例如1、2、3、4、5、6…。如果我们交换任意两个索引2i–1和2i,结果将恰好增加2。我们需要进行K次这样的交换。
示例
#include<iostream>
using namespace std;
void showPermutations(int n, int k) {
for (int i = 1; i <= n; i++) {
int a = 2 * i - 1;
int b = 2 * i;
if (i <= k)
cout << b << " " << a << " ";
else
cout << a << " " << b << " ";
}
}
int main() {
int n = 4, k = 2;
showPermutations(n, k);
}输出结果
2 1 4 3 5 6 7 8