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 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9
10 const int maxn=105;
11
12 int n,k;
13 int a[1025];
14
15 void solve()
16 {
17     int i;
18     for(i=n-2;i>=0;i--)
19         if(a[i]<a[i+1])   break;
20     if(i==-1)
21     {
22         sort(a,a+n);
23         return;
24     }
25     int MIN=0x3f3f3f;
26     int k;
27     for(int j=i+1;j<n;j++)
28     {
29         if(a[j]>a[i] && a[j]<MIN)
30         {
31             MIN=a[j];
32             k=j;
33         }
34     }
35
36     int temp=a[i];
37     a[i]=a[k];
38     a[k]=temp;
39
40     sort(a+i+1,a+n);
41 }
42
43
44 int main()
45 {
46     //freopen("D:\\input.txt","r",stdin);
47     int T;
48     scanf("%d",&T);
49     while(T--)
50     {
51         scanf("%d%d",&n,&k);
52         for(int i=0;i<n;i++)
53             scanf("%d",&a[i]);
54         while(k--)   solve();
55         for(int i=0;i<n;i++)
56         {
57             if(i)  printf(" ");
58             printf("%d",a[i]);
59         }
60         printf("\n");
61     }
62 }
时间: 2024-11-04 12:29:47

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 next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序: 当排列无后继的最大值时返回值为false,其他的为true: 也可以在其后加一个cmp函数 1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 5 using namespace std; 6

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 2388(排序)

http://poj.org/problem?id=2388 题意:就N个数的中位数. 思路:用快排就行了.但我没用快排,我自己写了一个堆来做这个题.主要还是因为堆不怎么会,这个拿来练练手. 1 #include <stdio.h> 2 #include <string.h> 3 4 int arr[10005],ans,n; 5 6 void inset(int x,int y) //插入,并排序. 7 { 8 int i; 9 for(i = y; arr[ i / 2 ] &

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,表示

POJ题目分类推荐 (很好很有层次感)

著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递

初学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

POJ 刷题指南

OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递推. 构造法.(POJ 3295) 模拟法.(POJ 1068,POJ 2632,POJ 1573,POJ 2993,POJ 2996) 二