有兴趣的同学可以去下数据包自己做一下
——————————————————————————————————————————————————————
1、 输入一行字母(长度小于等于10),输出:第一行输出全排列个数,从下一行开始按字典序输出这些字母所有可能的排列,每行一个。
思路:个数为长度阶乘,直接暴力即可,注意读入and输出的优化,不然长度为10时会爆

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a[200],l,k,c[200];
char b[200];
char s[30];
void ja()
{int ans=1;for (int i=1;i<=k;i++) ans*=i;printf("%d\n",ans);
}
void f(int x)
{if (x==k) puts(b);else for (int i=1;i<=c[0];i++)if (a[c[i]]) {b[x]=c[i];a[c[i]]=0;f(x+1);a[c[i]]=1;}
}
main()
{gets(s);l=strlen(s);for (int i=0;i<=l-1;i++) {if (a[s[i]]==0) k++;a[s[i]]=1;}for (int i=65;i<=125;i++) if (a[i]>0) c[++c[0]]=i;ja();f(0);
}

2、 第一行输入一个字符串,(长度小于等于15)第二行输入一个数字m,输出:第一行输出从这个字符串里面选出m个的组合数,从下一行开始按字典序输出可能的组合(每个组合也要把字母按字典序排好,每行一个。)
思路:组合数,排序后直接搞就可以了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
char s[30],b[30];
int l,m,a[300],c[300],k;
long long jc(int x)
{long long k=1;for (int i=2;i<=x;i++) k*=i;return k;
}
void ja()
{long long a1=1,a2=1,a3=1;a1=jc(m);a2=jc(l-m);a3=jc(l);printf("%lld\n",a3/(a2*a1));
}
void f(int x,int y)
{if (y==m) puts(b);else for (int i=x+1;i<=k;i++){b[y]=c[i];f(i,y+1);}
}
main()
{gets(s);l=strlen(s);scanf("%d",&m);ja();for (int i=0;i<l;i++) a[s[i]]++;for (int i=65;i<=130;i++)while (a[i]>0) {c[++k]=i;a[i]--;}f(0,0);
}

3、输入一行字母(长度小于等于26),输出它所有的全排列里面,按字典序排在它后面的那个。
思路:(如果有同学愿意用STL模版也没问题)我的想法是从末尾开始找,找到有一个位置i,它(s[i])的后面有比它更大的字母,然后在后面这些比它大的字母中找出最小的一个字母s[j],将两者交换,然后对位置i后的字母进行降序排列就可以了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
char s[30],s1[30];
int l,a[200];
bool flag=false;
string c="";
void ff(int x)//排序
{if (x>=l) return;int t=x;for (int i=x+1;i<l;i++)if (s[i]<s[t]) t=i;char ge;ge=s[x];s[x]=s[t];s[t]=ge;ff(x+1);
}
void f(int x)//找字母
{int t=x;for (int i=x+1;i<l;i++)if (s[i]>=s[x]&&(s[t]>=s[i]||t==x)) t=i;  if (t!=x) {char ge;ge=s[x];s[x]=s[t];s[t]=ge;flag=true;ff(x+1);}else  f(x-1);
}
main()
{gets(s);l=strlen(s);f(l-1);puts(s);
}

4、第一行输入一个字符串,第二行输入一个数字m,输出这些字母的全排列里面按字典序排名m的序列。
思路:我们可以对原字符串进行排序,存到一个新字符串中,然后对原字符串从头到尾的每一位进行判断,由此可以判断出它的序号。
比如(ans初始值为1)排序后为abc,则序号应该是3!=3*2!(字符串长度),若第一位为a,那么序号应该在1~1*2!;若为b则序号在(1*2!+1)~2*2!;若c则在(2*2!+1)~3*2!,以此类推,每确定一位后将长度–,逐个累加即可

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
long long m,l,num=1;
char s[300],s2[300];
string s1="";
long long jia(long long x)
{long long t=1;for (int i=2;i<=x;i++)t*=i;return t;
}
void solve(int x)
{if (x==strlen(s)) return;for (int i=1;i<=l;i++)if (m>=(i-1)*jia(l-1)+1&&m<=i*jia(l-1))//在这个范围内{putchar(s1[i-1]);for (int j=i;j<l;j++) s1[j-1]=s1[j];m-=(i-1)*jia(l-1);l--;solve(x+1);break;}
}
main()
{gets(s);l=strlen(s);scanf("%lld",&m);for (int i=0;i<l;i++) s2[i]=s[i];sort(s+0,s+l);for (int i=0;i<l;i++) s1+=s[i];solve(0);
}

5、输入一行字母输出它在这些字母的全排列里面按字典序的序号。
思路:把上面的讨论倒过来用就可以了,这里我们可以对字符串进行字符删除操作

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
long long num=1,ans=1;
long long  m,l,ja[30000];
char s[30000],s2[30000];
bool flag[30000];
string s1="";
void f()
{ja[0]=1;for (int i=2;i<=l;i++){ja[i-1]=num;num*=i;}ja[l]=num;
}
void pd(int x)
{if (x==strlen(s2)) return;int k=s1.find(s2[x],0);int sum=0;ans+=(k*ja[(strlen(s2)-x-1)]);for (int i=k+1;i<l;i++)s1[i-1]=s1[i];l--;pd(x+1);
}
main()
{gets(s);l=strlen(s);for (int i=0;i<l;i++) s2[i]=s[i];sort(s+0,s+l);for (int i=0;i<l;i++) s1+=s[i];f();pd(0);cout<<ans;
} 

6、输入一行字母(长度小于等于9,可能有重复字母),输出:第一行输出全排列个数,从下一行开始按字典序输出这些字母所有可能的排列,每行一个。
思路:把全排列数算出来,然后除以(sum(c[1])!sum(c[2])!..sum(c[n])!)(sum()是该元素出现个数)。
至于重复,我们可以加一个flag判断一下blabla,我说不下去了,自己看吧

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a[200],l,c[200],jia[200],ans;
char b[200];
char s[30];
bool flag[300];
int ja(int x)
{int ans=1;jia[0]=1;for (int i=2;i<=x;i++) {jia[i-1]=ans;ans*=i;}jia[x]=ans;return ans;
}
void f(int x)
{if (x==l) puts(b);else for (int i=1;i<=c[0];i++)if (!flag[i]&&(c[i-1]!=c[i]||!flag[i-1])){flag[i]=true;b[x]=c[i];f(x+1);flag[i]=false;}
}
main()
{gets(s);l=strlen(s);for (int i=0;i<=l-1;i++) a[s[i]]++;ans=ja(l);for (int i=65;i<=125;i++) {int p=a[i];while (p>0) {c[++c[0]]=i;p--;}      ans/=jia[a[i]];}printf("%d\n",ans);f(0);
}

7、第一行输入一个字符串(长度小于等于15可能有重复字母),第二行输入一个数字m,输出:第一行输出从这个字符串里面选出m个的组合数,从下一行开始按字典序输出可能的组合(每个组合也要把字母按字典序排好,每行一个。)
思路:最后一题懒得仔细想了,直接STL狗,重复两次,第一次算数目,第二次输出,暴力解决︿( ̄︶ ̄)︽( ̄︶ ̄)︿

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<map>
using namespace std;
char s[30],b[30];
int l,m,a[300],c[300],k,ans;
map<string,bool> flag,hh;
long long jc(int x)
{long long k=1;for (int i=2;i<=x;i++) k*=i;return k;
}
void f(int x,int y)
{if (y==m) {string s="";for (int i=0;i<m;i++) s+=b[i];if (!flag[s]){flag[s]=true;ans++;}}else for (int i=x+1;i<=k;i++){b[y]=c[i];f(i,y+1);}
}
void fff(int x,int y)
{if (y>=m) {string s="";for (int i=0;i<m;i++) s+=b[i];if (!hh[s]){hh[s]=true;puts(b);}}else for (int i=x+1;i<=k;i++){b[y]=c[i];fff(i,y+1);}
}
main()
{gets(s);l=strlen(s);scanf("%d",&m);for (int i=0;i<l;i++) a[s[i]]++;for (int i=65;i<=130;i++)while (a[i]>0) {c[++k]=i;a[i]--;}f(0,0);printf("%d\n",ans);fff(0,0);
}

【多题合集】【loliの模拟赛】排列组合大套餐相关推荐

  1. 大英赛C类翻译题合集

    大英赛C类翻译题合集 2012初赛 2013初赛 2013决赛 2014初赛 2014决赛 2012初赛 既然没有退路了,我们不妨试试他的方法.(might as well) Since there ...

  2. 网络安全web方向入门题合集

    网络安全web方向入门题合集 [HCTF 2018]WarmUp 验证 [极客大挑战 2019]EasySQL [极客大挑战 2019]Havefun [强网杯 2019]随便注 前期工作 堆叠注入查 ...

  3. 2020年前端面试之JS手写代码题合集

    2020年前端面试之JS手写代码题合集 预计会有上千道题,后续慢慢补! 1.  写一个把字符串大小写切换的方法 function caseConvert(str){return str.replace ...

  4. 备战网络工程师认证考试:历年真题合集

    备战网络工程师认证考试:历年真题合集 网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员.网络工程师能够从事计算机信息系统的设计.建设.运行和维护工作.参加全国计算机等级考试之 ...

  5. Coderforces 字符串水题合集

    今天我们聊聊 Coderforces 字符串水题合集. 字符串就是string. 这是string的百度翻译,我们要谈的是画框的.↓ string是C++.java.VB等编程语言中的字符串,字符串是 ...

  6. 计算机组成原理常考大题合集

    计算机组成原理常考大题合集 1.在"Cache-主存-辅存"三级存储体系中,"Cache-主存"结构与"主存-辅存"结构的引入为了解决什么问 ...

  7. HDLBits刷题合集—9 Arithmetic Circuits

    HDLBits刷题合集-9 Arithmetic Circuits HDLBits-66 Hadd Problem Statement 创建一个半加器.半加器将两个输入(不带低位的进位)相加产生和和向 ...

  8. java数组排列组合_java算法题--递归求数组中数字排列组合问题

    java算法题–递归求数组中数字排列组合问题 题目:有一个数组{1,2,3},输出数组中数字的所有可能组合: 比如:123.132.213- 解题思路 通过递归不停的交换数组中的两个数(当然,肯定是有 ...

  9. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附权威答案)

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

最新文章

  1. php blocklog_SQLSERVER中的logblock校验(译)
  2. 项目: 贪吃蛇(C语言)
  3. windows下 VScode+CMake+Linux远程调试
  4. weka和matlab完成完整分类实验
  5. aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案
  6. Hibernate C3P0连接池配置
  7. 用python画风车_python接口自动化()一)(实现一款简单的接口自动化框架)
  8. ubuntukylin ubuntu1304
  9. (五)从头开始构建风格迁移CycleGAN
  10. python中join和split使用
  11. php多个表查询的方法_php+mysql+ajax实现单表多字段多关键词查询的方法
  12. 【Tensorflow教程笔记】常用模块 tf.data :数据集的构建与预处理
  13. IE浏览器不能使用window.open()的解决方案
  14. 神经网络模型分类总结
  15. 面试被问“红黑树”,我一脸懵逼......
  16. 天牛群,天牛须结合粒子群算法BAS-PSO。研究生阶段毕生所 学,低价出售!可定制pid参数整定。
  17. OpenCV物体颜色检测(Python)
  18. dr优先级默认_DR和BDR优先级
  19. A Survey on Big Data Market: Pricing, Trading and Protection
  20. 吃:第二次去吃香草香草

热门文章

  1. c++qq主界面_QQ小程序,一个被严重低估的超级流量池!错过你就亏大了
  2. LaTeX中巨算符下面输入两行内容的方法
  3. C++ STL容器vector篇(三) vector容器大小和数组大小, 插入和删除元素, 存储和读取元素
  4. Typora主题定制及常用配置的设置方法
  5. anaconda安装好tensorflow后,无法在jupyter notebook上使用的解决方法
  6. poj 3026 BorgMaze 最小生成树Kruskal、Prim(Prim VS报错待解决
  7. 最短路 dijkstra模板
  8. 产品报价单模板_外贸干货 | 外贸人的好东西,报价单这样做才专业!
  9. 全攻略:大病医疗专项附加扣除,一文集全了
  10. 安卓布局,GridLayout