关注
再贴一种方法哈,昨天吃饭时候跟朋友讨论,换了一种思路,昨天晚上做了一下。
#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
相关推荐
11-28 16:45
门头沟学院 Java 点赞 评论 收藏
分享
牛客热帖
更多
- 1... 2025的主旋律是蛰伏,落寞,遗憾1.1W
- 2... 杂记近期所面试的三家中小厂9576
- 3... 岁末论道:谁才是牛客 2025 最强修仙者?7770
- 4... 圣诞节用 AI 做个牛客运营翻翻乐!(含代码)5965
- 5... 选择即命运—2025年度总结4917
- 6... 大学废物离开优绩主义之后发现外面根本没下雨4606
- 7... 从H200解禁评估:国资算力平台还值得应届就业吗?4332
- 8... 实习没事做是福也是祸3032
- 9... 我只是一个脆弱的人2921
- 10... 互联网实习求职的黑话和timeline,你所需要知道的……2911
正在热议
更多
# 2025年终总结 #
173879次浏览 2933人参与
# 找工作,行业重要还是岗位重要? #
85464次浏览 1693人参与
# 牛客2025仙途报告 #
427次浏览 7人参与
# 职场上哪些行为很加分? #
307201次浏览 3458人参与
# 大家每天通勤多久? #
70045次浏览 449人参与
# 实习的内耗时刻 #
211427次浏览 1545人参与
# 你面试体验感最差/最好的公司 #
18434次浏览 305人参与
# 一人说一个提前实习的好处 #
11278次浏览 206人参与
# 今年你最想重开的一场面试是? #
4313次浏览 70人参与
# 秋招落幕,你是He or Be #
12846次浏览 247人参与
# 互联网行业现在还值得去吗 #
46950次浏览 351人参与
# 实习没事做是福还是祸? #
17235次浏览 260人参与
# 面试吐槽bot #
165036次浏览 814人参与
# 重来一次,你会对开始求职的自己说 #
6261次浏览 160人参与
# 反问环节如何提问 #
126407次浏览 2665人参与
# 礼物开箱Plog #
741次浏览 24人参与
# 工作中听到最受打击的一句话 #
6953次浏览 118人参与
# 团建是“福利”还是是 “渡劫” #
7382次浏览 150人参与
# 我的第一份实习怎么找的 #
208618次浏览 1827人参与
# 比亚迪工作体验 #
74805次浏览 281人参与


CVTE公司福利 732人发布