想哥 level
获赞
131
粉丝
10
关注
8
看过 TA
8
华中科技大学
2017
大数据开发工程师
IP属地:湖北
暂未填写个人简介
私信
关注
2016-09-13 16:45
已编辑
华中科技大学 大数据开发工程师
0 点赞 评论 收藏
分享
2016-09-06 00:38
已编辑
华中科技大学 大数据开发工程师
RT
CHN_ByteDance:真是一条合理而造福大家的建言。
0 点赞 评论 收藏
分享
2016-08-04 14:13
已编辑
华中科技大学 大数据开发工程师
昨晚这题没做出来,不甘心,不甘心,不甘心啊,难道只能枚举了吗?求大神攻破,以身相许了!!!!!!! 大致题意(如果有问题望指正,谢谢): 课桌上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种序列...
LambdaZJU:再贴一种方法哈,昨天吃饭时候跟朋友讨论,换了一种思路,昨天晚上做了一下。 #include <iostream> #include <vector> #include <string> #include <queue> #include <unordered_map> #include <map> #include <algorithm> using namespace std; //输入参数 int n;//输入n个数 int k;//有序对k对 vector<int> a;//输入序列a,包含1~n的n个数,有若干个数(不超过10个)是0 //输出参数 int cnt=0;//合法排列的数目 //输出perm数组,用于测试 void printperm(const vector<vector<int> > &perm) { for(int i=0;i<perm.size();i++) { for(int j=0;j<perm[0].size();j++) cout<<perm[i][j]<<" "; cout<<endl; } } //第一步,选出用于全排列的数 void chooseperm(vector<int> &permuse) { vector<int> permtemp; int permnum=0;//需要全排列的数的个数 int temp=0; for(int i=1;i<=n;i++)//初始化为1~n permtemp.push_back(i); for(int i=0;i<a.size();i++)//移除输入中已有的数 { if(a[i]) { remove(permtemp.begin(),permtemp.end(),a[i]); temp++; } } permnum=n-temp;//n-移除的数,即需要全排列的数的个数 for(int i=0;i<permnum;i++)//得到用于全排列的vector permuse.push_back(permtemp[i]); } //第二步,对第一步选出的数全排列 void creatperm(vector<vector<int> > &perm,vector<int> &permuse) { do{ perm.push_back(permuse); }while(next_permutation(permuse.begin(), permuse.end())); } //第三步,拼接第二步得到的全排列的二维vector和已有的输入 void insertperm(vector<vector<int> > &perminsert,const vector<vector<int> > &perm) { for(int i=0;i<perm.size();i++) { vector<int> tempinsert; int q=0; for(int p=0;p<n;p++) { if(a[p]) tempinsert.push_back(a[p]); else tempinsert.push_back(perm[i][q++]); } perminsert.push_back(tempinsert); } } //第四步,逐行验证其有序对是否为k,统计符合的个数 void count( const vector<vector<int> > &choose) { for(int i=0;i<choose.size();i++) { int ktemp=0; vector<int> temp=choose[i]; for(int j=0;j<temp.size();j++) { for(int jj=j+1;jj<temp.size();jj++) { if(temp[j]<temp[jj]) ktemp++; } } if(ktemp==k) cnt++; } } int main(){ //输入 cin>>n>>k; for(int i=0;i<n;i++) { int temp; cin>>temp; a.push_back(temp); } //第一步,选出用于全排列的数 vector<int> permuse;//用于全排列的数 chooseperm(permuse); cout<<"用于全排列的数"<<endl; for(int i=0;i<permuse.size();i++) cout<<permuse[i]<<" "; cout<<endl; //第二步,对第一步选出的数全排列 vector<vector<int> > perm;//得到全排列的二维vector creatperm(perm,permuse); cout<<"全排列"<<endl; printperm(perm); //第三步,拼接第二步得到的全排列的二维vector和已有的输入 vector<vector<int> > perminsert; insertperm(perminsert,perm); cout<<"符合模板的排列"<<endl; printperm(perminsert); //第四步,逐行验证其有序对是否为k,统计符合的个数 count(perminsert); cout<<"符合的排列个数"<<endl; cout<<cnt<<endl; }
投递网易等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务