題目描述
牛牛的作業薄上有乙個長度為 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 路徑...