|
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