Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาการเรียงสับเปลี่ยนของตัวเลข 2N เพื่อให้ผลลัพธ์ของนิพจน์ที่กำหนดคือ 2K ใน C++


สมมติว่าเรามีจำนวนเต็ม 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 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