假设我们有两个整数N和K。我们必须找到2N个自然数的第一个置换,以便满足以下方程式。
$$\ displaystyle \ sum \ limits_ {i = 1} ^ N \ lvert A_ {2i-1} -A_ {2i} \ rvert + \ lvert \ displaystyle \ sum \ limits_ {i = 1} ^ N A_ {2i-1 } -A_ {2i} \ rvert = 2K $$
K的值应小于或等于N。例如,如果N = 4且K = 1,则输出将为2 1 34。给定表达式的结果将为(| 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