เรามีจำนวนธรรมชาติ N ตัวแรก งานของเราคือการเรียงสับเปลี่ยนหนึ่งครั้งโดยที่ผลต่างที่แน่นอนระหว่างทุกๆ สององค์ประกอบที่ต่อเนื่องกันคือ> 1 หากไม่มีการเปลี่ยนแปลงดังกล่าว ให้คืนค่า -1
วิธีการนั้นง่าย เราจะใช้วิธีโลภ เราจะจัดเรียงเลขคี่ทั้งหมดโดยเรียงลำดับเพิ่มขึ้นหรือลดลง จากนั้นจึงจัดเรียงเลขคู่ทั้งหมดตามลำดับการลดลงหรือเพิ่มขึ้น
อัลกอริทึม
จัดN(n)
Begin if N is 1, then return 1 if N is 2 or 3, then return -1 as no such permutation is not present even_max and odd_max is set as max even and odd number less or equal to n arrange all odd numbers in descending order arrange all even numbers in descending order End
ตัวอย่าง
#include <iostream> using namespace std; void arrangeN(int N) { if (N == 1) { //if N is 1, only that will be placed cout << "1"; return; } if (N == 2 || N == 3) { //for N = 2 and 3, no such permutation is available cout << "-1"; return; } int even_max = -1, odd_max = -1; //find max even and odd which are less than or equal to N if (N % 2 == 0) { even_max = N; odd_max = N - 1; } else { odd_max = N; even_max = N - 1; } while (odd_max >= 1) { //print all odd numbers in decreasing order cout << odd_max << " "; odd_max -= 2; } while (even_max >= 2) { //print all even numbers in decreasing order cout << even_max << " "; even_max -= 2; } } int main() { int N = 8; arrangeN(N); }
ผลลัพธ์
7 5 3 1 8 6 4 2