嵊州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()的更多相关文章

  1. 全排列next_permutation()用法和构造函数赋值

    全排列next_permutation()用法 在头文件aglorithm里 就是1~n数组的现在的字典序到最大的字典序的依次增加.(最多可以是n!种情况) int a[n]; do{ }while( ...

  2. 关于全排列 next_permutation() 函数的用法

    这是一个c++函数,包含在头文件<algorithm>里面,下面是基本格式. 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下 ...

  3. 全排列 ( next_permutation)

    SLT: C++的STL有一个函数可以方便地生成全排列,这就是next_permutation 在C++ Reference中查看了一下next_permutation的函数声明: #include ...

  4. 全排列 next_permutation 用法

    给一个正整数n,让你求它的全排列 先介绍一个函数,iota(a,a+n,1) 用法就是把a数组的第0位到第n-1位依次赋为1,2,.....n: 然后是next_permutation(a,a+4)函 ...

  5. 排列2(全排列next_permutation 注意格式)

    排列2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. 蓝桥杯 方格填数 DFS 全排列 next_permutation用法

    如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...

  7. 全排列 next_permutation() 函数的用法

    在头文件<algorithm>里面有如下代码: int a[]; do { } while(next_permutation(a,a+n)); 可产生1~n的全排列有如下代码: #incl ...

  8. 全排列 next_permutation() 函数的使用

    看来看去还是这篇博客比较简洁明了 https://www.cnblogs.com/My-Sunshine/p/4985366.html 顺便给出牛客网的一道题,虽然这道题用dfs写出全排列也能做,题意 ...

  9. STL中关于全排列next_permutation以及prev_permutation的用法

    这两个函数都包含在algorithm库中.STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation. 一.函数原型 首先我们来看看这两个函数 ...

随机推荐

  1. glibc_error reporting

    很多GNU C库里的函数都会侦测并报告错误条件.我们的程序需要检测这些错误条件.比如:我们打开一个输入文件时需要判断该文件是否正确的打开.如果没有正确打开,我们需要打印错误或者采取其他正确的方式.为了 ...

  2. 【windows】常见的系统环境变量,如%appdata%表示什么意思

    原文:[windows]常见的系统环境变量,如%appdata%表示什么意思 1.介绍 %appdata%就代表了C:Users\用户名\AppData\Roaming这个文件夹. “%”是系统变量的 ...

  3. WPF 为资源字典 添加事件响应的后台类

    原文:WPF 为资源字典 添加事件响应的后台类 前言,有许多同学在写WPF程序时在资源字典里加入了其它控件,但又想写事件来控制这个控件,但是资源字典没有CS文件,不像窗体XAML还有一个后台的CS文件 ...

  4. UWP-电子音读出文字

    原文:UWP-电子音读出文字 源码: https://github.com/lindexi/Markdown 代码 private async void speech(string str, Medi ...

  5. 数据库连接池之_DButils

    // 这个是在添加数据 @Test public void demo1() { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); ...

  6. 判断当前进程是否以管理员权限运行(AllocateAndInitializeSid后,用CheckTokenMembership与AdministratorsGroup进行比较,和Delphi的那个例子还有点不一样)

    在Win7下(Vista以上的...)有时某些操作就是会让人郁闷 开启了UAC的话,得以管理员权限运行才不会出现Access is denied... 但是,程序又不是非得什么时候都用那破管理员权限的 ...

  7. csdn token

    http://download.csdn.net/download/pp_haitun/9614126 http://dl.download.csdn.net/down11/20160826/28b9 ...

  8. ubuntu 14.04搭建tensorflow-gpu开发环境

    一.安装nvidia显卡驱动 去navidia官网查看最新的驱动版本号:navidia官网:http://www.geforce.cn/drivers 找到显卡对应的驱动下载,例如下载的驱动为 NVI ...

  9. ASP.NET Web API 直到我膝盖中了一箭【1】基础篇

    蓦然回首,那些年,我竟然一直很二. 小时候,读武侠小说的时候,看到那些猪脚,常常会产生一种代入感,幻想自己也会遭遇某种奇遇,遇到悬崖跳下去是不是有本“武林秘笈”在等着?长大以后也是一样,多少人梦着醒着 ...

  10. C#中await/async闲说

    自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要从底层开始编写,这样后边使用的时候 ...