牛牛的作業薄上有乙個長度為 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
關鍵是求全排列,需要遞迴的求出所有排列
全排列演算法及實現:
全排列函式**:
void func( vector
& vec ,int deep)
cout
<< endl;
}else
}}
本題演算法**:
#include
#include
using
namespace
std;
bool find(vector
v,int n) //查詢v中是否存在整數n
vector
> pv; //全域性變數
void perm(vector
&v,int st) //對v中的數字進行全排列
}}void change(vector
&v,vector
subv,vector
vpos)//將v中的0用全排之後的數字分別代替
int main()
for(int i = 0;iif(v[i]==0)
vpos.push_back(i); //記錄下vector中0的位置
for(int i = 1;i<=n;++i)
if(!find(v,i))
subv.push_back(i);
perm(subv,0);
vector
vcnt;
for(int i = 0;iint vcntk = 0;
for(int i = 0;iif(vcnt[i]==k)
++vcntk;
cout
牛牛的作業薄上有乙個長度為 n 的排列 a,這個排列包含了從1到n的n個數,但是因為一些原因,其中有一些位置 不超過 10 個 看不清了,但是牛牛記得這個數列順序對的數量是 k,順序對是指滿足 i j 且 a i a j 的對數,請幫助牛牛計算出,符合這個要求的合法排列的數目。輸入描述 每個輸入包含... 牛牛的作業薄上有乙個長度為 n 的排列 a,這個排列包含了從1到n的n個數,但是因為一些原因,其中有一些位置 不超過 10 個 看不清了,但是牛牛記得這個數列順序對的數量是 k,順序對是指滿足 i j 且 a i a j 的對數,請幫助牛牛計算出,符合這個要求的合法排列的數目。輸入描述 每個輸入包含... 題目描述 解題思路 首先,順序對的個數互不影響。也就是說,對於陣列a來說,增加 插入 乙個數字,其a的順序對個數不變,所以新陣列a 1的順序對個數 陣列a的順序對 新插入的數字產生的順序對.進而推廣到,增加c個數字,新陣列a c的順序對 陣列a的順序對 陣列c的順序對 每個新插入的數字產生順序對 共...程式設計題 數列還原
網易程式設計(數列還原)
牛客網2017校招真題 數列還原