百練 1833排列

2021-10-02 13:43:45 字數 1932 閱讀 2310

描述

題目描述:

大家知道,給出正整數n,則1到n這n個數可以構成n!種排列,把這些排列按照從小到大的順序(字典順序)列出,如n=3時,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六個排列。

任務描述:

給出某個排列,求出這個排列的下k個排列,如果遇到最後乙個排列,則下1排列為第1個排列,即排列1 2 3…n。

比如:n = 3,k=2 給出排列2 3 1,則它的下1個排列為3 1 2,下2個排列為3 2 1,因此答案為3 2 1。

輸入

第一行是乙個正整數m,表示測試資料的個數,下面是m組測試資料,每組測試資料第一行是2個正整數n( 1 <= n < 1024 )和k(1<=k<=64),第二行有n個正整數,是1,2 … n的乙個排列。

輸出

對於每組輸入資料,輸出一行,n個數,中間用空格隔開,表示輸入排列的下k個排列。

樣例輸入

3

3 12 3 1

3 13 2 1

10 2

1 2 3 4 5 6 7 8 9 10

樣例輸出

3 1 2

1 2 3

1 2 3 4 5 6 7 9 8 10

#include

#include

#define max 1024

using

namespace std;

int num[max +10]

;int

cmp(

const

void

*a1,

const

void

*a2)

intmain()

for(

int q=

1;q <= k;

++q)

} num[minpos]

= num[i -1]

; num[i -1]

= min;

qsort

(num + i,n - i +1,

sizeof

(int

),cmp);}

else

for(j =

1;j <= n;

++j)

num[j]

= j;

}for

(i =

1;i <= n;

++i)

printf

("%d "

,num[i]);

printf

("\n");

}}

找不到規律

1.從num[n],開始往左邊找,直到num[i] > num[i - 1];

2.從i開始向右找直到找到最小的比num[i - 1]大的數並交換;

3.若已經是逆序,則下乙個為順序。

#include

#include

#define max 1024

using

namespace std;

int num[max +10]

;int

main()

for(i =

0;i < k;

++i)

for(i =

1;i <= n;

++i)

printf

("%d "

,num[i]);

printf

("\n");

}}

next_permutation不知道有這個stl。

百練2748 全排列

遞迴 有的問題在解決時,可以先做一步操作,操作後的局面是和原問題形式相同但是規模變小的新問題,由新問題的答案可以推出原問題的答案,這樣的問題,就可以使用遞迴解決。這種情況下使用遞迴,會不停地縮小問題的規模,直到問題縮小到某一規模後 稱為滿足了某個終止條件 就無法或者不必再遞迴縮小其規模,而是立即求出...

Vb工程 百例91 排列視窗

option explicit private sub mdiform load form1.show 顯示窗體form1 form2.show form3.show end sub private sub mnuquit click endend sub 此例子的重點知識 mdi窗體的arrang...

Vb工程 百例91 排列視窗

option explicit private sub mdiform load form1.show 顯示窗體form1 form2.show form3.show end sub private sub mnuquit click endend sub 此例子的重點知識 mdi窗體的arrang...