AcWing 420. 火星人
考察:STL(?)
思路:
最简单的做法:next_permutation 全排列.
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 const int N = 10010; 5 int a[N]; 6 int main() 7 { 8 int n,cnt; 9 scanf("%d%d",&n,&cnt); 10 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 11 while(cnt--) 12 next_permutation(a+1,a+n+1); 13 for(int i=1;i<=n;i++) printf("%d ",a[i]); 14 return 0; 15 }
做法二:模拟next_permutation
思路:模拟发现,字典序的全排列,由第i个变到第i+1个是将第k位数字变得大一点,这个第k位就是从尾到头第一个不是升序的数字.我们要做的是将a[k]变成a[k]+1,k位后的数字需要让它变成字典序最小,也就是reverse
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 const int N = 10010; 5 int a[N]; 6 int main() 7 { 8 int n,cnt; 9 scanf("%d%d",&n,&cnt); 10 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 11 while(cnt--) 12 { 13 int k = n-1; 14 while(a[k]>a[k+1]) k--; 15 int t = k++; 16 while(a[t]<a[k]) k++; 17 swap(a[t],a[k-1]); 18 reverse(a+t+1,a+n+1); 19 //printf("\n"); 20 } 21 for(int i=1;i<=n;i++) printf("%d ",a[i]); 22 return 0; 23 }