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. 【集训队互测2015】Robot

    题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...

  2. 集合源码分析[2]-AbstractList 源码分析

    AbstractList 类型:抽象类 接口的继承以及实现关系 继承AbstractCollection 实现List接口 典型方法实现解析 public List<E> subList( ...

  3. ORCAL Merge into用法总结

    简单的说就是,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据. 有一个表T,有两个字段a.b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在 ...

  4. static_assert与assert

    C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法:static_assert(常量表达式,提示字符串). 如果第一个参数常量表达式的值为fals ...

  5. 分布式版本控制系统 Git 的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/CJL29 ...

  6. 【优秀的图片后期编辑工具】Luminar 3.1 for Mac

     [简介] 今天和大家分享最新的 Luminar for Mac 3.1 版本,支持中文界面,Luminar是一款Mac上优秀的图片后期处理工具,功能类似 Photoshop Lightroom 等软 ...

  7. 1x1的卷积核有什么作用

    信道压缩~跨~信~减 一.1 X 1的卷积核作用 所谓信道压缩,Network in Network是怎么做到的? 对于如下的二维矩阵,做卷积,相当于直接乘以2,貌似看上去没什么意义: 但是,对于下面 ...

  8. 为程序启用 守护进程-- supervisior

    待补充... Add this to your /etc/supervisord.conf: [rpcinterface:supervisor] supervisor.rpcinterface_fac ...

  9. 《Java》第九周学习总结

    下载mysql 选择mysql的管理软件 idea可以直接连接 然后用库运行程序,但是没有截图,,因为想在navicat上试试,可惜速度太慢了 打开idea又很慢,所以明天再更新

  10. Python——一个简单的进度条的实现

    import math def process_bar(total_work,work_index,length): times = total_work / length # 长度倍数,用来缩放或扩 ...