1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 |
题意: 给你某个排列 求从下一个排列开始的第k个排列<br>如果是最后一个排列 则下一个排列为1 2 3 ... n<br> // 1 用stl 里面的 next_permutation<br>// 2 用生成下一个排列算法<br>// 1)从末尾开始找第一个正序 A[i-1]<A[i]<br>// 2)从i开始找最大的j A[j]>A[i-1]<br>// 3)交换 A[i-1],A[j]<br>// 4)将下标从i开始的序列翻转 <br><br>#include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using
namespace std; int
s[2000]; int
n,k; void
change( int
l, int r) { while (l<r) { swap(s[l],s[r]); l++; r--; } } int
main() { int
T; int
i; scanf ( "%d" ,&T); while (T--) { scanf ( "%d %d" ,&n,&k); for (i=0;i<n;i++) scanf ( "%d" ,&s[i]); while (k--) next_permutation(s,s+n); for (i=0;i<n-1;i++) printf ( "%d " ,s[i]); printf ( "%d\n" ,s[i]); } return
0; } /* 2 #include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int s[2000]; int n,k; void change(int l,int r) { while(l<r) { swap(s[l],s[r]); l++; r--; } } bool permutation() { int i=n-1; while(i>0&&s[i-1]>=s[i]) i--; if(!i) return false; int k=i,j=n-1; for(;j>i;j--) if(s[j]>s[i-1]){ k=j; break; } swap(s[i-1],s[k]); change(i,n-1); return true; } int main() { int T; int i; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&k); for(i=0;i<n;i++) scanf("%d",&s[i]); while(k--) { if(!permutation()) change(0,n-1); } for(i=0;i<n-1;i++) printf("%d ",s[i]); printf("%d\n",s[i]); } return 0; } */ |
原文:http://www.cnblogs.com/372465774y/p/3603061.html