POJ 1833 排序

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于POJ 1833 排序的主要内容,如果未能解决你的问题,请参考以下文章

POJ1833 排列 调用全排列函数 用copy函数节省时间 即使用了ios同步代码scanf还是比较快

POJ1833 &amp; POJ3187 &amp; POJ3785 next_permutation应用

POJ 1833 排列STL/next_permutation

LeetCode 1833 雪糕的最大数量[排序 贪心] HERODING的LeetCode之路

文巾解题 1833. 雪糕的最大数量

leetcode No1833 雪糕的最大数量