(个人水平有限,请见谅!)
题目描述:
牛牛的作业薄上有一个长度为 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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector <vector <int>> pv;
vector <int> number;
int arrangment(vector <int> del, int tt);
int insert(vector <int> array, vector <int> none, vector <int> del);
int main()
{
int n, k;
cin >> n >> k;
vector <int> array(n,0), none, find(n,0), del;
for (int i = 0; i < n; i++)
{
int temp = 0;
cin >> temp;
array[i] = temp;
if (temp > 0)
find[temp-1] = 1;
if (temp == 0)
none.push_back(i);
}
for (int i = 0; i < n; i++)
if (find[i] == 0)
del.push_back(i+1);
arrangment(del, 0);
for (int i = 0; i < pv.size(); i++)
insert(array, none, pv[i]);
int cnt = 0;
for (int i = 0; i < number.size(); i++)
if (number[i] == k)
cnt++;
cout << cnt;
}
int arrangment(vector <int> del, int tt)
{
if (tt == del.size())
pv.push_back(del);
else
{
for (int i = tt; i < del.size(); i++)
{
swap(del[i],del[tt]);
arrangment(del, tt+1);
swap(del[i],del[tt]);
}
}
return 0;
}
int insert(vector <int> array, vector <int> none, vector <int> del)
{
int num = 0;
for (int i = 0; i < none.size(); i++)
array[none[i]] = del[i];
for (int i = 0; i < array.size()-1; i++)
{
for (int j = i+1; j < array.size(); j++)
{
if (array[i] < array[j])
num++;
}
}
number.push_back(num);
return 0;
}