數列還原 全排列應用

2021-08-21 22:09:52 字數 1568 閱讀 5846

題目描述

牛牛的作業薄上有乙個長度為 n 的排列 a,這個排列包含了從1到n的n個數,但是因為一些原因,其中有一些位置(不超過 10 個)看不清了,但是牛牛記得這個數列順序對的數量是 k,順序對是指滿足 i < j 且 a[i] < a[j] 的對數,請幫助牛牛計算出,符合這個要求的合法排列的數目。

輸入描述:

每個輸入包含乙個測試用例。每個測試用例的第一行包含兩個整數 n 和 k(1 <= n <= 100, 0 <= k <= 1000000000),接下來的 1 行,包含 n 個數字表示排列 a,其中等於0的項表示看不清的位置(不超過 10 個)。

輸出描述:

輸出一行表示合法的排列數目。

輸入 複製

5 5

4 0 0 2 0

輸出 複製

2手撕:

#include

#include

#include

using

namespace

std;

int my_next_permutation(int *beg,int *end)

reverse(beg,end);// 已經逆序,回歸初始狀態

return0;}

int find_pair(vector

& a)

}return pairnum;

}

測試:

int main()

; vector

vr(n);

vector

rest;

for(int i=0;icin>>vr[i];

a[vr[i]]=1;

}for(int i=1;i<=n;++i)

sort(rest.begin(),rest.end());

int* it=rest.data();

int res=0;

do if (find_pair(vr) == k)

res++;

for(int i=0;iif(vr[i]<=0)

vr[i]=0;

}} while (my_next_permutation(it,it+rest.size()));

cout

《全排列過程:

/** tips: next permuation based on the ascending order sort

* sketch :

* current: 3 7 6 2 5 4 3 1 .

* | | | |

* find i----+ j k +----end

* swap i and k :

* 3 7 6 3 5 4 2 1 .

* | | | |

* i----+ j k +----end

* reverse j to end :

* 3 7 6 3 1 2 4 5 .

* | | | |

* find i----+ j k +----end

* */

全排列函式應用

題目描述 大家知道,給出正整數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...

全排列的應用

親7數 大致問題是 給定一些個位數如 1,1,2,0 這種,計算完全使用這些數字構成的數能整除7的個數 輸入 1 1 2 輸出 2 一開始想用next permutation 直接秒的,後來測試不對,對於重複的元素排列組合,只會算是同一種情況 比如1 1 2的全排列應該是有 1 1 2 1 1 2 ...

全排列(回溯法的應用)

解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程 1 路徑 也就是已經做出的選擇。2 選擇列表 也就是你當前可以做的選擇。3 結束條件 也就是到達決策樹底層,無法再做選擇的條件。一 全排列問題 for 選擇 in 選擇列表 做選擇 將該選擇從選擇列表移除 路徑.add 選擇 backtrack 路徑...