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

按照字典的顺序(a-z) (1-9),可以得出任意两个数字串的大小。比如“123”, 最小的是“123”(从小到大),最大的是“321”(从大到小)。这样对于“123”的所有排列,可以得到按照字典序排序的有序集合 : 1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1。

如果有n个数的排列,

1) 从最右边开始找,找到第一个 i ,使得arr[i] > arr[i-1];

2) 从 i 到 n 这个范围找到最小的比 arr[i-1] 大的数字,交换这个数和 arr[i-1];

3) 从 arr[i] 到 arr[n] 排序 qsort(arr, i, n);

 #include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define N_MAX 1025
int n, k;
int a[N_MAX]; void printf_arr()
{
for (int i = ; i <= n; i++) {
printf("%d ", a[i]);
}
printf("\n");
} void qsort(int *a, int begin, int end)
{
if (begin >= end) return;
int l = begin, r = end, k = a[l];
while (l != r) {
while (l < r && k <= a[r]) r--;
while (l < r && k >= a[l]) l++;
if (l < r) {
int tmp = a[l];
a[l] = a[r];
a[r] = tmp;
}
}
a[begin] = a[l];
a[l] = k;
qsort(a, begin, l - );
qsort(a, l + , end);
} int main(int argc, char* argv[])
{
//setbuf(stdout, NULL);
//freopen("sample_input.txt", "r", stdin); int T = ;
scanf("%d", &T); while (T--) {
scanf("%d %d", &n, &k); for (int j = ; j <= n; j++) {
scanf("%d", &a[j]);
} while (k--) {
int i = n;
// step 1 : find a[i] > a[i - 1]
for (; i > ; i--) {
if (a[i] > a[i - ])
break;
}
// the biggest
if (i == ) {
for (int i = ; i <= n; i++) {
a[i] = i;
}
continue;
} // step 2 : find the min in [i, n]
int min = n;
int l = i - ;
int r = i;
for (int j = i; j <= n; j++) {
if (a[j] > a[l] && a[j] < min) {
min = a[j];
r = j;
}
} // step 2 : swap(min, a[i - 1])
int tmp = a[l];
a[l] = a[r];
a[r] = tmp; // step 3 : qsort [i, n]
qsort(a, i, n);
} printf_arr();
}
return ;
}

POJ:1833 按字典序找到下一个排列:的更多相关文章

  1. 31. Next Permutation (java 字典序生成下一个排列)

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  2. next_permutation():按字典序输出下一个排列

    #include<iostream> #include<algorithm> using namespace std; int main() { int data[4]={5, ...

  3. leetcode 31. Next Permutation(字典序的下一个)

    描述: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  4. POJ 1146 ID Codes 用字典序思想生成下一个排列组合

    ID Codes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7644   Accepted: 4509 Descript ...

  5. LinkCode 下一个排列、上一个排列

    http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列 ...

  6. [Swift]LeetCode31. 下一个排列 | Next Permutation

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  7. Leetcode题库——31.下一个排列

    @author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...

  8. 代码题(45)— 下一个排列、第k个排列

    1.31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只 ...

  9. 【LeetCode】下一个排列【找规律】

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

随机推荐

  1. [HNOI2012]集合选数(状压DP+构造)

    题目要求若出现x,则不能出现2x,3x 所以我们考虑构造一个矩阵 \(1\ 2\ 4 \ 8--\) \(3\ 6\ 12\ 24--\) \(9\ 18\ 36--\) \(--\) 不难发现,对于 ...

  2. java 11 实现RFC7539中指定的ChaCha20和Poly1305两种加密算法, 代替RC4

    实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法 RFC7748定义的秘钥协商方案更高效, 更安全. JDK增加两个新的接口 XECPublicKey 和 ...

  3. Linux下nc命令的使用

    nc命令的作用 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口 端口的扫描,nc可以作为client发起TCP或UDP连接 机器之间传输文件 机器之间网络测 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

    https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...

  5. Ps 应用小技巧总结

    一.如何等比例放大图片? 使用形状工具,画图之后,保存为智能对象,但是 ctrl+T 之后放大,会有虚边: 解决办法:编辑智能对象,在新的画布中:图像---图像大小----ctrl+alt+I 此处进 ...

  6. OSPFv3实验配置(GNS3)

    实验目的 1. 掌握 OSPFv3(v2) 的配置方法 2. 掌握在帧中继环境下 OSPFv3 (v2)的配置方法 3. 掌握 OSPFv3(v2) NSSA 的配置方法 4. 掌握外部路由汇总的配置 ...

  7. [Deep Learning] 神经网络基础

    目前,深度学习(Deep Learning,简称DL)在算法领域可谓是大红大紫,现在不只是互联网.人工智能,生活中的各大领域都能反映出深度学习引领的巨大变革.要学习深度学习,那么首先要熟悉神经网络(N ...

  8. Writage让你的Word支持Markdown

    Writage 简单的执行后,word就可以在保存或打开的时候支持Markdown了!

  9. Java(19)JDBC

    一.使用jdbc的步骤 a.引入数据库厂商提供的驱动程序(引入jar包) b.记载驱动程序 Clss.forName("驱动程序类") c.获得连接 Connection con ...

  10. 【2】学习C++之引用

    C++中的引用类似于现实生活中人们之间起昵称,昵称和本名都可以辨别人. 1.普通变量的引用: ;//a为本名 int &b=a;//b为a的昵称 其中不能光有昵称没有本名,如果只定义了引用,却 ...