网易编程(数列还原)
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;
}
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含两个整数 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;
}
相关文章推荐
- 面试题:数列还原(网易笔试17)
- 网易2017内推笔试编(数列还原)
- 数列还原-网易python
- 网易2018校招内推编程题集合:小易喜欢的数列 [python]
- 网易2018校招内推编程题 小易喜欢的数列
- 网易2018校招内推编程题_小易喜欢的数列
- 网易编程题:数列还原
- 网易2018校园招聘编程真题之重排数列
- 编程之美 2.9 斐波那契(Fibonacci)数列
- 输入两个正整数n和m,从数列1,2,3.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来.编程求解
- 网易2018校招编程题集合7
- 网易2017秋招编程题集合
- 网易2017笔试 编程题目
- 网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,
- 网易2017秋招编程题集合
- 网易2017秋招编程题集合
- 编程实现备份和还原数据库
- 网易测编程试题-CD收录歌曲计算
- 编程之美 裴波那楔数列
- 悲剧中的网易编程挑战赛