題目給定N 和 K, 要求構造一組排列,第i 項的數值和i + 1項的差絕對值要有k種。
思路:
1. 對於有序排列,變化只有一種。
2. 而N 個元素的排列,最多只有N - 1種變化。
我們先想一想如何構造N - 1種變化,再利用 第一點思路把N - 1種變化變成k種變化。
可以知道要達到N - 1種變化,只有頭尾元素輪換才可以達成,就以N = 6來舉例
[6, 1, 5, 2, 4, 3] 變化為N - 1種。
那麼我們現在考慮如何把變化縮減,繼續以N = 6舉例,考慮k = 3。
[6, 1, 5, 4, 3, 2] 可以看出當k為3,我們只要把第3位之後的排序變為有序,變化就只有一種了。
我一開始做的時候,直接把他統一變為降序,發現出錯了,因為當k 為奇數時,他是最大值要採用降序,當k為雙數的時候要採用升序,因為k的位置為最小值。
那麼只要把k的情況劃分就可以完成了。
#include <iostream>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
int x = n, y = 1;
if(k % 2){
for(int i = 1; i <= n; i++){
if(i % 2 && i < k + 1) cout << x-- << " ";
else if(!(i%2) && i < k) cout << y++ << " ";
else cout << x-- << " ";
}
}else{
for(int i = 1; i <= n; i++){
if(i % 2 && i < k + 1) cout << x-- << " ";
else cout << y++ << " ";
}
}
return 0;
}
構造題