2017届网易内推笔试-机器学习(数据挖掘)编程第二题求解
昨晚这题没做出来,不甘心,不甘心,不甘心啊,难道只能枚举了吗?求大神攻破,以身相许了!!!!!!!
大致题意(如果有问题望指正,谢谢):
课桌上n个格子摆放成一行,里面放着1~n的正整数(乱序),有几个(不超过10个)格子看不清是什么数字,
但是牛牛记得整个序列中有k个有序对,即当 i<j 时,A[i]<A[j]。求满足所有条件的序列有多少种?
输入:第一行输入n k,第二行输入序列,看不清的数字用0代替,其中1<n<100,1<k<10000000000
例:
输入:
5 5
4 0 0 2 0
输出:
2
ps:满足条件的2种序列可以找到为:4 3 1 2 5、4 1 5 2 3(均满足有5个有序对)
/********************************************************************************************************/
//谢谢牛友的提示,以下纯手写,望批评指正!!!
#网易##C++工程师#大致题意(如果有问题望指正,谢谢):
课桌上n个格子摆放成一行,里面放着1~n的正整数(乱序),有几个(不超过10个)格子看不清是什么数字,
但是牛牛记得整个序列中有k个有序对,即当 i<j 时,A[i]<A[j]。求满足所有条件的序列有多少种?
输入:第一行输入n k,第二行输入序列,看不清的数字用0代替,其中1<n<100,1<k<10000000000
例:
输入:
5 5
4 0 0 2 0
输出:
2
ps:满足条件的2种序列可以找到为:4 3 1 2 5、4 1 5 2 3(均满足有5个有序对)
/********************************************************************************************************/
//谢谢牛友的提示,以下纯手写,望批评指正!!!
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<vector<int> > permutation(int n){
//全排列
vector<vector<int> > res;
vector<int> num(n);
for(int i=0;i<num.size();i++){
num[i]=i+1;
}
do{
res.push_back(num);
}while(next_permutation(num.begin(),num.end())); //如果知道这个next_permutation是库函数,是不是好做很多,不知道的是因为leetcode没刷好
return res;
}
void finduse(vector<vector<int> > &res,vector<int> data){
//找出满足看的清的数字的所有序列
for(int i=0;i<res.size()-1;i++){
for(int j=0;j<data.size();j++){
if(data[j]!=res[i][j]&&data[j]!=0){
res.erase(res.begin()+1);
i--;
break;
}
}
}
}
int findsum(vector<vector<int> > res,int k){
//找到满足k个有序对的所有序列,计算这样序列的个数
int ll=res.size();
int l=(*res.begin()).size();
int count=0;
for(int i=0;i<ll;i++){
int sum=0;
for(int j=0;j<l-1;j++){
for(int s=j+1;s<l;s++){
if(res[i][j]<res[i][s])
sum++;
}
}
if(sum==k)
count++;
}
return count;
}
int main(){
int n;
int k;
while(cin>>n>>k){
if(n<=0||n>100)
break;
vector<int> data(n);
for(int t=0;t<n;t++){
cin>>data[t];
vector<vector<int> > res = permutation(n);
finduse(res,data);
int count = findsum(res,k);
cout<<count<<endl;
}
return 0;
}
OPPO成长空间 955人发布
