POJ:1833 按字典序找到下一个排列:
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 按字典序找到下一个排列:的更多相关文章
- 31. Next Permutation (java 字典序生成下一个排列)
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- next_permutation():按字典序输出下一个排列
#include<iostream> #include<algorithm> using namespace std; int main() { int data[4]={5, ...
- leetcode 31. Next Permutation(字典序的下一个)
描述: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- POJ 1146 ID Codes 用字典序思想生成下一个排列组合
ID Codes Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7644 Accepted: 4509 Descript ...
- LinkCode 下一个排列、上一个排列
http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列 ...
- [Swift]LeetCode31. 下一个排列 | Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- Leetcode题库——31.下一个排列
@author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...
- 代码题(45)— 下一个排列、第k个排列
1.31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只 ...
- 【LeetCode】下一个排列【找规律】
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
随机推荐
- [GXOI/GZOI2019]旧词(树上差分+树剖)
前置芝士:[LNOI2014]LCA 要是这题放HNOI就好了 原题:\(\sum_{l≤i≤r}dep[LCA(i,z)]\) 这题:\(\sum_{i≤r}dep[LCA(i,z)]^k\) 对于 ...
- 【学习笔记】JS知识点整理
1 原型/原型链 1-1 原型 定义:原型是function对象的一个属性,定义了构造函数制造出的对象的公共祖先.通过该构造函数产生的对象,可以继承该原型的属性和方法. 原型是一个对象. 可以利用原型 ...
- msyql存储数据时字段被截断
关于mysql中字段类型为text文本存储json格式数据,字段被截断的问题 背景: 字段类型 MEDIUMTEXT 确定存储内容5548个字符,换算为字节不超过16M 数据库内已经存在更长内容的存储 ...
- slickedit编译调试linux应用程序
目录 slickedit编译调试linux应用程序 工程建立 编译 智能报错跳转 配置编译环境 调试 title: slickedit编译调试linux应用程序 date: 2019/3/19 17: ...
- 基于jeesite的cms系统(一):开发环境搭建
基于jeesite的cms系统系列,是对基于jeesite进行二次开发的博客模块开发过程的总结.涉及入门安装,二次开发,部署等 一.概况: JeeSite 是一个 Java 企业级快速开发平台,基于经 ...
- RabbitMQ 和 Kafka
============================RabbitMQ 术语============================RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分 ...
- PaginatorSet
from django.core.paginator import Paginator, EmptyPage class PaginatorSet: def __init__(self, limit= ...
- linux 每个小时释放一次cache
echo 3 > /proc/sys/vm/drop_caches;
- Optimal Marks SPOJ 839
这题远超其他题非常靠近最小割的实际意义: 割边<=>付出代价<=>决定让两个点的值不相同,边权增加 最小割<=>点的值与s一个阵营的与s相同,与t一个阵营的与t相同 ...
- .Net 之 RPC 框架之Hprose(远程调用对象)
实现远程调用对象,跨进程访问对象,可实现分布式 首先给服务端和客户端 nuget Hprose 可使用tcp和http两种调用方式 服务端 using Hprose.Server; using Sys ...