Permutations
Permutations
يكون تبديل الأعداد \(1, 2, \ldots, n\) جميلًا إذا لم يكن الفرق بين أي عنصرين متجاورين فيه \(1\).
أنشئ تبديلًا جميلًا، أو بيّن أنه لا يوجد.
القيود:
- \(1 \le n \le 10^6\)
الإدخال:
- سطر واحد: عدد صحيح \(n\).
المخرجات:
- تبديل جميل للأعداد \(1, 2, \ldots, n\). إذا وُجد أكثر من تبديل فاطبع أيًّا منها. إذا لم يوجد فاطبع
NO SOLUTION.
أمثلة:
الإدخال:
5
المخرجات:
4 2 5 3 1
الإدخال:
3
المخرجات:
NO SOLUTION
الحل
نبدأ بقيم \(n\) الصغيرة، كما يقترح درس الخوارزميات البنائية:
- \(n = 1\): التبديل \(1\) ليس فيه عناصر متجاورة، فهو جميل.
- \(n = 2\) و \(n = 3\): يمكننا فحص كل الترتيبات؛ في كل منها يجاور \(2\) العدد \(1\) أو العدد \(3\). لا يوجد حل.
- \(n = 4\): التبديل \(2\ 4\ 1\ 3\) جميل.
فكرة \(2\ 4\ 1\ 3\) تصلح لكل \(n \ge 4\): نطبع أولًا كل الأعداد الزوجية بترتيب تصاعدي، ثم كل الأعداد الفردية بترتيب تصاعدي.
- الفرق بين عددين زوجيين متجاورين \(2\)، وكذلك بين عددين فرديين متجاورين.
- عند الحد الفاصل يجاور أكبر عدد زوجي العدد \(1\). هذا العدد الزوجي لا يقل عن \(4\)، لذلك لا يقل الفرق عن \(3\).
عندما \(n = 1\) لا يطبع البرنامج نفسه أي عدد زوجي ثم يطبع العدد \(1\)، وهذا صحيح أيضًا.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n == 2 || n == 3) {
cout << "NO SOLUTION\n";
return 0;
}
// first all even numbers, then all odd numbers
for (int i = 2; i <= n; i += 2) {
cout << i << ' ';
}
for (int i = 1; i <= n; i += 2) {
cout << i << ' ';
}
cout << "\n";
}