cf #598 B. Minimize the Permutation

题意

q次询问,每次询问给你长度为n的排列,然后你每次可以选择一个位置i和i+1的数字进行交换。但是每个位置只能交换一次,问你反转若干次后,这个排列最小是多少?

分析:模拟题,直接代码。(一开始读错题了,外加思路不清晰)

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int vis[110], pos[110], v[110];
 4 int n;
 5 int main()
 6 {
 7     int t; cin >> t;
 8     while (t--)
 9     {
10         cin >> n;
11         for (int i = 1; i <= n; i++)
12             cin >> v[i], pos[v[i]] = i;
13         memset(vis, 0, sizeof(vis));
14         vis[0] = 1;
15         for (int i = 1; i <= n; i++)
16         {
17             while (!vis[pos[i] - 1])
18             {
19                 vis[pos[i] - 1] = 1;
20                 swap(v[pos[i]], v[pos[i] - 1]);
21                 swap(pos[i], pos[v[pos[i]]]);
22             }
23             vis[pos[i]] = 1;
24         }
25         for (int i = 1; i <= n; i++)
26             printf("%d%c", v[i], i == n ? '\n' : ' ');
27     }
28 }

猜你喜欢

转载自www.cnblogs.com/liuwenhan/p/11800015.html