网易编程(数列还原)

来源:互联网 发布:淘宝用户积分查询 编辑:程序博客网 时间:2024/05/24 06:08

牛牛的作业薄上有一个长度为 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 numvector<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 pairif (a[i] < a[j]) pairnum++;}}if (pairnum == K)num++;pairnum = 0;} while (next_permutation(iter, iter + fuznum.size()));cout << num << endl;}




原创粉丝点击