题意:给定一个序列,求它的下k个排列

#include <stdio.h>
#include <stdlib.h> int cmp(const void *a,const void *b)
{
return (*(int *)a-*(int *)b);
} void getNext(int *arr,int n)
{
int i,j,flag,t;
for(i=n-;i>=;i--)
{
if(arr[i]<arr[i+])
break;
}//找到左边小于右边,并返回左边数的下标
if(i==-)
{
qsort(arr,n,sizeof(arr[]),cmp);
return ;
}//以防遇到递减数列,找不到
flag=i+;
for(j=i+;j<n;j++)//当i==n-2,不走这个循环,那么倒数第二个数后面就只有一个数比他大,可能就要直接交换保证最小增长
{
if(arr[j]>arr[i])//假设说倒数第二个数大于倒数第三个数,可是倒数第一个数比倒数第三个数小
flag=j;//flag始终记录当前比a[i]大的值的下标
}
t=arr[flag];
arr[flag]=arr[i];
arr[i]=t;
qsort(&arr[i+],n--i,sizeof(arr[]),cmp);//有可能要qsort一个数
} int main()
{
int a[],ncase,i;
scanf("%d",&ncase);
while(ncase--)
{
int n,k;
scanf("%d%d",&n,&k);
for(i=;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=;i<k;i++){
getNext(a,n);
}
for(i=;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
return ;
}
for(j=i+;j<n;j++)//当i==n-2,不走这个循环,那么倒数第二个数后面就只有一个数比他大,可能就要直接交换保证最小增长
{
if(arr[j]>arr[i])//假设说倒数第二个数大于倒数第三个数,可是倒数第一个数比倒数第三个数小
flag=j;//flag始终记录当前比a[i]大的值的下标
}

这段代码有3涉及到最后两个,三个,四个的情况

字典序算法描述:从右边开始,遍历整个数列,先取数列的倒数第二个数与倒数第一个数相比,如果左边大于右边则让i--,让倒数第三个与倒数第二个相比,如果倒数第三个小于倒数第二个

那么此时循环结束,记下倒数第三个数的下标

否则直到找到左边一个数大于右边一个数为止,不过可能这个数列一开始就一个递减数列,i==0也不行,i==-1,循环被遍历完

此时在getNext里面直接qsort这个数列

分为四种情况:

1.倒数第2个<倒数第1个

2.倒数第3个<倒数第2个    a. 倒数第3个>倒数第1个 b. 倒数第3<倒数第1个

3.倒数第四个....反正从倒数第2个开始就有可能小于倒数第四个

flag的作用啊!!

字典序算法核心:为保证最小增长,将a[i]后面大于a[i]的最小的数与a[i]对调,然后从小到大排序,因为越小的数在越前面,数列越小

poj1833---字典序算法的更多相关文章

  1. 常见算法合集[java源码+持续更新中...]

    一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...

  2. arithmetic

    字典序算法 http://www.cnblogs.com/darklights/p/5285598.html 字典排序(lexicographical order)是一种对于随机变量形成序列的排序方法 ...

  3. ACM POJ 1146 ID Codes

    题目大意:输入一个字符串.输出它的下一个字典序排列. 字典序算法思想: 1.从右向左寻找字符串找出第一个a[i]<a[i+1]的位置i; 2.从右向左找出第一个大于a[i]的元素a[j]; 3. ...

  4. C语言深度剖析-----函数

    认清函数的真面目 函数的意义 面向过程的程序设计 函数声明和定义 函数参数 编写代码的时候,不要编写类似先后调用的代码 f(k,k++) C语言中的顺序点 a--&&a  ,& ...

  5. PTA数据结构 习题2.8 输出全排列 (20分)

    习题2.8 输出全排列 (20分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出正整数n(<10 ...

  6. 全排列算法(字典序法、SJT Algorithm 、Heap's Algorithm)

    一.字典序法 1) 从序列P的右端开始向左扫描,直至找到第一个比其右边数字小的数字,即. 2) 从右边找出所有比大的数中最小的数字,即. 3) 交换与. 4) 将右边的序列翻转,即可得到字典序的下一个 ...

  7. [模板] 匈牙利算法&&二分图最小字典序匹配

    匈牙利算法 简介 匈牙利算法是一种求二分图最大匹配的算法. 时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\). 空间复杂度: 邻接表/前向星: \(O(n ...

  8. [PHP]算法-拼接最小字典序的实现

    拼接最小字典序: 给定一个字符串类型的数组strs,请找到一种拼接顺序,使得将所有字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的并放回这个大字符串. 思路: 1.字典序,12345这五个数, ...

  9. ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)

    题目链接: https://vjudge.net/problem/ZOJ-1456 These are N cities in Spring country. Between each pair of ...

随机推荐

  1. CentOS 7 上搭建LNMP环境

    (转自美团云知识库Chris) 简介 LNMP是Linux.Nginx.MySQL(MariaDB)和PHP的缩写,这个组合是最常见的WEB服务器的运行环境之一.本文将带领大家在CentOS 7操作系 ...

  2. sqlmap新手注入

    一 什么是sqlmap sqlmap is an open source penetration testing tool that automates the process of detectin ...

  3. 我的android studio

  4. MFC中SQLite数据库的使用

    1打开数据库 BOOL playDlg::openData() { WCHAR a[100]; CString path; path = m_exePath+L"sentence_makin ...

  5. Invalidate(TRUE)与Invalidate(FALSE)区别(前者会发送WM_ERASEBKGND消息全部刷新,然后使用WM_PAINT消息绘制,而后者只发送WM_PAINT消息)

    使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息. 使用Invalidate(FALSE)函数时,它只会向消息队列中添加了WM_P ...

  6. opennebula extend(expending) auth module ldap

    LDAP Authentication addon permits users to have the same credentials as in LDAP, so effectively cent ...

  7. XCode工程中ARC模式与非ARC模式共用(转)

    Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外, ...

  8. win10安装数据库:[INS-13001]

    升级win10系统之后,需要重新安装Oracle,因为在安装Oralce11g时,使用64位的会出现各种不兼容问题,我每次安装都是使用32位的数据库. 在安装时点击setup.exe之后,出现了:[I ...

  9. 无法识别的属性“targetFramework”

    问题描述:无法识别的属性“targetFramework”.请注意属性名称区分大小写. 解决办法:修改.NET Framework 版本为相应版本即可,例如2.0换成4.0. 参考:http://bl ...

  10. oracle11g+ef+vs2013做的项目在部署的时候碰到的问题

    最近公司做一个项目,用到了ef和oracle11g,开发工具用的是vs2013,开发完成后,在本机上完美运行,但是,当到了要到服务器上部署的时候,就出了问题,服务器环境是server08R2,开发环境 ...