嵊州D2T2 八月惊魂 全排列 next_permutation()
嵊州D2T2
八月惊魂
这是一个远古时期的秘密,至今已无人关心。
这个世界的每个时代可以和一个 1 ∼ n 的排列一一对应。
时代越早,所对应的排列字典序就越小。
我们知道,公爵已经是 m 个时代前的人物了。
并且通过翻阅古籍,我们得知了公爵所在时代所对应的排列。
那么我们的时代所对应的排列是什么?
希望以此能寻回我们失落的文明……
Input
第一行一个正整数 n。
第二行一个正整数 m。
第三行 n 个整数,表示公爵所在时代对应的排列。
Output 一行 n 个整数,表示我们所在的时代对应的排列。
Examples
| august.in | august.out |
|
5 3 1 2 3 4 5 |
1 2 4 5 3 |
Notes
对于所有数据,满足 n ≤ 10000 , m ≤ 100。
Task1[30%]
n ≤ 10
Task2[60%]
n ≤ 50
Task3[100%]
无特殊限制
Solve!
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
//freopen("august.in","r",stdin);
//freopen("august.out","w",stdout);
int n,m; scanf("%d%d",&n,&m);
int line[n];
for(int i=;i<n;i++) scanf("%d",&line[i]);
while(m--) next_permutation(line , line + n);
for(int i=;i<n;i++) {printf("%d ",line[i]);}
return ;
}
这篇博客园,之所以我要先code,是因为我连题目都看不懂
时代越早,所对应的排列字典序就越小。
是吗?字典序是什么呀~
还要一个一个推吗?怎么推?
于是我就搁着了。。。
后来
再看std(题解)
next_permutation(line , line + n);
这是什么函数呀?
原来是STL里面的呀。。。
真的没看过呀!!!o(╥﹏╥)o......

next_permutation全排列函数是一个十分好用而且强大的函数。
要想更好的了解这个函数可以看https://blog.csdn.net/howardemily/article/details/68064377
排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示。
当M=N时,称为全排列(Permutation)。
从数学角度讲,全排列的个数A(N,N)=(N)*(N-1)*...*2*1=N!,但从编程角度,如何获取所有排列?那么就必须按照某种顺序逐个获得下一个排列,通常按照升序顺序(字典序)获得下一个排列。
例如对于一个集合A={1,2,3,},首先获取全排列a1: 1,2,3,;然后获取下一个排列a2: 1,3,2,;
按此顺序,A的全排列如下:
a1: 1,2,3; a2: 1,3,2; a3: 2,1,3; a4: 2,3,1; a5: 3,1,2; a6: 3,2,1; 共6种。
对于给定的任意一种全排列,如果能求出下一个全排列的情况,那么求得所有全排列情况就容易了。
好在STL中的algorithm已经给出了一种健壮、高效的方法,下面进行介绍。
next_permutation()
a)从后向前查找第一个相邻元素对(i,j),并且满足A[i] < A[j]。
易知,此时从j到end必然是降序。可以用反证法证明,请自行证明。
b)在[j,end)中寻找一个最小的k使其满足A[i]<A[k]。
由于[j,end)是降序的,所以必然存在一个k满足上面条件;并且可以从后向前查找第一个满足A[i]<A[k]关系的k,此时的k必是待找的k。
c)将i与k交换。
此时,i处变成比i大的最小元素,因为下一个全排列必须是与当前排列按照升序排序相邻的排列,故选择最小的元素替代i。
易知,交换后的[j,end)仍然满足降序排序。因为在(k,end)中必然小于i,在[j,k)中必然大于k,并且大于i。
d)逆置[j,end)
由于此时[j,end)是降序的,故将其逆置。最终获得下一全排序。
注意:如果在步骤a)找不到符合的相邻元素对,即此时i=begin,则说明当前[begin,end)为一个降序顺序,即无下一个全排列,STL的方法是将其逆置成升序。
next_permutation()拓展
如何获取所有全排列情况?
STL中的代码非常精妙,利用next_permutation的返回值,判断是否全排列结束(否则将死循环)。对于给定的一个数组,打印其所有全排列只需如下:
void all_permutation(int arr[], int n)
{
sort(arr,arr+n); // 先用sort排序
do{//用do……while保证至少做一遍
for(int i=; i<n; printf("%d ",arr[i++]));
printf("\n");
}while(next_permutation(arr,arr+n));//判断也是计算
}
All Permutation
请循其本
所以,我们的代码呢,只要一行(核心部分)呢!
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
//freopen("august.in","r",stdin);
//freopen("august.out","w",stdout);
int n,m; scanf("%d%d",&n,&m);
int line[n];
for(int i=;i<n;i++) scanf("%d",&line[i]);
while(m--) next_permutation(line , line + n);
for(int i=;i<n;i++) {printf("%d ",line[i]);}
return ;
}
别忘记加头文件哈!
#include <algorithm>
OK!
嵊州D2T2 八月惊魂 全排列 next_permutation()的更多相关文章
- 全排列next_permutation()用法和构造函数赋值
全排列next_permutation()用法 在头文件aglorithm里 就是1~n数组的现在的字典序到最大的字典序的依次增加.(最多可以是n!种情况) int a[n]; do{ }while( ...
- 关于全排列 next_permutation() 函数的用法
这是一个c++函数,包含在头文件<algorithm>里面,下面是基本格式. 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下 ...
- 全排列 ( next_permutation)
SLT: C++的STL有一个函数可以方便地生成全排列,这就是next_permutation 在C++ Reference中查看了一下next_permutation的函数声明: #include ...
- 全排列 next_permutation 用法
给一个正整数n,让你求它的全排列 先介绍一个函数,iota(a,a+n,1) 用法就是把a数组的第0位到第n-1位依次赋为1,2,.....n: 然后是next_permutation(a,a+4)函 ...
- 排列2(全排列next_permutation 注意格式)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 蓝桥杯 方格填数 DFS 全排列 next_permutation用法
如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...
- 全排列 next_permutation() 函数的用法
在头文件<algorithm>里面有如下代码: int a[]; do { } while(next_permutation(a,a+n)); 可产生1~n的全排列有如下代码: #incl ...
- 全排列 next_permutation() 函数的使用
看来看去还是这篇博客比较简洁明了 https://www.cnblogs.com/My-Sunshine/p/4985366.html 顺便给出牛客网的一道题,虽然这道题用dfs写出全排列也能做,题意 ...
- STL中关于全排列next_permutation以及prev_permutation的用法
这两个函数都包含在algorithm库中.STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation. 一.函数原型 首先我们来看看这两个函数 ...
随机推荐
- 【Gerrit】Performance Cheat Sheet
首先说下做这件事情的主因,组内有人说Project repo sync有点慢,废话不多说,直接上图. 相关官方文档参考链接: 我的数据: ~/review_site/logs# fgrep " ...
- qmake.exe是在Qt安装编译时生成的,里面内嵌了Qt相关的一些路径(最简单的方法是保持一样的安装路径,最方便的办法是设置qt.conf文件)
在网上直接下载别人编译好的Qt库,为自己使用省了不少事.但往往也会遇到些问题,其中Qt version is not properly installed,please run make instal ...
- 腾讯QQ 8.9.3体验版发布 在线文档多端同步实时保存
感谢N软网的投递 腾讯体验中心迎来QQ8.9.3首个维护体验版发布,详细版本号为v8.9.3.21006,上一个体验版v8.9.2.20717发布于4月20日,时隔34天又迎来了更新.本次升级主要是在 ...
- IT回忆录-2
随着网络的发展,下载工具也不断地更新. 印象比较深的下载工具,从网络蚂蚁.网际快车,到BT. BT出来的时候,对下载真的是一个革命啊,以前下载东西,下载的人越多肯定就越慢,我们之前还会跑到一些FTP上 ...
- 【Qt】无边框窗体中带有ActiveX组件时的一个BUG
无意中发现的一个BUG,Qt5.1.1正式版首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)接着 ...
- qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写(sender()取得发信号的对象后,就取得了它的全部信息,为所欲为)
当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...
- 跨平台网络通信与服务器框架 acl 3.2.0 发布,acl_cpp 是基于 acl 库的 C++ 库
acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/F ...
- jqGrid使用经验分享(一)——jqGrid简单使用、json格式和jsonReader介绍
广大的读者朋友们大家好,很高兴又可以在博客中和大家分享我的开发经验了. 此次,我准备向大家介绍一个非常好用的jQuery表格插件——jqGrid. 如果您在实际项目中遇到web端表格展示功能的需求,又 ...
- uni-app中vue组件父子值传递
一.父组件向子组件传递数据(props) <template> <view class="container" style="background: # ...
- SYN6107型 GPS北斗双模子钟
SYN6107型 GPS北斗双模子钟 产品概述 SYN6107型GPS北斗双模子钟是由西安同步电子科技有限公司精心设计.自行研发生产的一套以接收北斗卫星信号的子钟,从北斗地球同步卫星上获取标准时钟信号 ...