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 }

 

posted @ 2021-02-23 15:50  acmloser  阅读(65)  评论(0编辑  收藏  举报