poj 1833

http://poj.org/problem?id=1833

next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序;

当排列无后继的最大值时返回值为false,其他的为true;

也可以在其后加一个cmp函数

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 int main()
 8 {
 9     int k,n,m,a[1029];
10     scanf("%d",&n);
11     while(n){
12         n--;
13         scanf("%d%d",&m,&k);
14         for(int i=0;i<m;i++)
15             scanf("%d",&a[i]);
16         for(int i=0;i<k;i++)
17             next_permutation(a,a+m);
18         for(int i=0;i<m;i++)
19         {   if(i==m-1) printf("%d\n",a[i]);
20             else printf("%d ",a[i]);
21         }
22     }
23 }
时间: 2024-10-11 14:27:19

poj 1833的相关文章

POJ 1833 生成排列

题目链接:POJ 1833 /************************************ * author : Grant Yuan * time : 2014/10/19 16:38 * source : POJ 1833 * algorithm: STL+排列的生成 *************************************/ #include <iostream> #include <algorithm> #include <cstdio&

POJ 1833 排序

http://poj.org/problem?id=1833 题意: 给出一个排序,求出它之后的第k个排序. 思路: 排序原理: 1.如果全部为逆序时,说明已经全部排完了,此时回到1~n的排序. 2.从后往前找到第一对 ai<ai+1,然后从i+1~n寻找比ai大的最小的数并与之互换,之后再对i+1~n的数进行排序即可. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #includ

POJ 1833 排列(全排列 STL)

题目链接:http://poj.org/problem?id=1833 Description 题目描述: 大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排列. 任务描述: 给出某个排列,求出这个排列的下k个排列,如果遇到最后一个排列,则下1排列为第1个排列,即排列1 2 3-n. 比如:n = 3,k=2 给出排列2 3 1,则它的下1个排列为3

poj 1833 排列

根据一个序列,求下一个序列.如果一串数字是降序排列,则一定是组合成的最大的数字,只要这串数字中有地方是升序的,则不是组合成的最大数字.比如:num[6] = 123654 从后向前,如果num[i] < num[i+1],则停止循环,在这里是3<6,则从num[i+1]后边的数字(5和4)里面找到一个数n,n满足条件n>3(num[i])&&n<6(num[i+1]),而且这个n是找到的满足条件里面的最小的(如果找不到这个n,则交换num[i]和num[i+1]),

POJ 1833 排列【STL/next_permutation】

题目描述: 大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排列. 任务描述: 给出某个排列,求出这个排列的下k个排列,如果遇到最后一个排列,则下1排列为第1个排列,即排列1 2 3…n. 比如:n = 3,k=2 给出排列2 3 1,则它的下1个排列为3 1 2,下2个排列为3 2 1,因此答案为3 2 1. Input 第一行是一个正整数m,表示

初学ACM - 组合数学基础题目PKU 1833

题目链接:http://poj.org/problem?id=1833 题意说的很清楚,就是找出当前排列后的第k个排列. 很容易的,就能利用STL的next_permulation()函数写出一个答案: #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int data[1025]; int main(){     int n,k,m;     scanf(&q

是时候学一波STL了。。。

都到如今了还不会STL,赶紧学习一下. .. 头文件#include<algorithm> 加上 using namespace std. 求下一个排列的函数:next_permutation(first,last),当中first,last都是指针变量.求的是区间 [first.last)的下一个排列.升序求得.比若说1 2 3 下一个排列是1 3 2.最后一个排列的下一个排列是第 一个.即3 2 1-->1 2 3.据说效率也不怎么样,poj 1833用G++交TLE.C++过了.

POJ 3449 Geometric Shapes --计算几何,线段相交

题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一步来吧. 还有收集了一个线段旋转的函数. Vector Rotate(Point P,Vector A,double rad){ //以P为基准点把向量A旋转rad return Vector(P.x+A.x*cos(rad)-A.y*sin(rad),P.y+A.x*sin(rad)+A.y*co

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京