您的位置:首页 > 编程语言

网易编程(数列还原)

2017-08-03 21:48 183 查看
牛牛的作业薄上有一个长度为 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 个)。

输出描述:

输出一行表示合法的排列数目。 

本文用到一个计算序列全排列的函数:next_permutation函数,需要强调的是,next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。编程的时候,灵活应用库函数可以,可以节省很多时间。

#include<iostream>
#include<string>
#include<vector>
#include<set>
#include <algorithm>
using namespace std;

int main()
{
int N, K;
int pairnum = 0;
int num = 0;
cin >> N >> K;
int a[100];
vector <int> s;
vector<int> fuzpos;
vector<int> fuznum;
for (int i = 0; i < N; ++i)
{
cin >> a[i];
s.push_back(a[i]);
if (a[i] == 0)
fuzpos.push_back(i); // missing num position
}
for (int i = 1; i <=N; ++i)
if (find(s.begin(), s.end(), i) == s.end())
fuznum.push_back(i); // missing num
vector<int> ::iterator iter = fuznum.begin();
do
{
for (int k = 0; k < fuznum.size(); ++k)
a[fuzpos[k]] = fuznum[k];
for (int i = 0; i < N-1; ++i)
{
for (int j = i+1; j < N; ++j)
{ //get order pair
if (a[i] < a[j])
pairnum++;
}
}
if (pairnum == K)
num++;
pairnum = 0;

} while (next_permutation(iter, iter + fuznum.size()));
cout << num << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程