演算法題 數列還原

2021-08-02 08:26:57 字數 1398 閱讀 3604

牛牛的作業薄上有乙個長度為 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 的對數,請幫助牛牛計算出,符合這個要求的合法排列的數目。輸入描述 每個輸入包含...

牛客網2017校招真題 數列還原

題目描述 解題思路 首先,順序對的個數互不影響。也就是說,對於陣列a來說,增加 插入 乙個數字,其a的順序對個數不變,所以新陣列a 1的順序對個數 陣列a的順序對 新插入的數字產生的順序對.進而推廣到,增加c個數字,新陣列a c的順序對 陣列a的順序對 陣列c的順序對 每個新插入的數字產生順序對 共...