在C++中查找2N个数的排列,使得给定表达式的结果恰好为2K
假设我们有两个整数N和K。我们必须找到前2N个自然数的第一个排列,使得满足以下等式。
$$ \displaystyle\sum\limits_{i=1}^N |A_{2i-1}-A_{2i}| + | \displaystyle\sum\limits_{i=1}^N A_{2i-1}-A_{2i} | = 2K $$
K的值应该小于或等于N。例如,如果N = 4且K = 1,则输出将为2 1 3 4。给定表达式的结果将为(|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
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP