关注
再贴一种方法哈,昨天吃饭时候跟朋友讨论,换了一种思路,昨天晚上做了一下。
#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;
}
查看原帖
点赞 3
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你觉得现在还能进互联网吗? #
1549次浏览 51人参与
# 如何准备秋招 #
4427次浏览 70人参与
# 现代汽车前瞻技术研发急速编程挑战赛 #
18126次浏览 159人参与
# 实习,不懂就问 #
14095次浏览 207人参与
# 哪个瞬间让你对大厂祛魅了? #
379357次浏览 2777人参与
# 你觉得实习能学到东西吗 #
6591次浏览 152人参与
# 如果中了500万,你会离职吗? #
86174次浏览 675人参与
# 面试时被问的最奇葩的问题 #
21490次浏览 124人参与
# 秋招什么时候开投比较合适? #
2707次浏览 49人参与
# 每个月的工资都是怎么分配的? #
6552次浏览 130人参与
# 软开人,秋招你打算投哪些公司呢 #
99390次浏览 932人参与
# 来聊聊你认为的薪资天花板是哪家? #
30273次浏览 173人参与
# 腾讯工作体验 #
473531次浏览 3489人参与
# 预测一下26届秋招形势 #
10175次浏览 114人参与
# 打工人的精神状态 #
51607次浏览 933人参与
# 职场情商大赛 #
131156次浏览 655人参与
# 非技术2024笔面经 #
384520次浏览 4732人参与
# 高考出分的那一天,我__ #
9194次浏览 141人参与
# 一觉醒来,秋招难度下降一万倍…… #
83497次浏览 642人参与
# 京东美团大战,你怎么看? #
92414次浏览 569人参与
# 你们公司几号发工资 #
18326次浏览 114人参与