PTA 1067 Sort with Swap(0, i) (贪心)
题目链接:1067 Sort with Swap(0, i) (25 分)
题意
给定长度为 $n$ 的排列,如果每次只能把某个数和第 $0$ 个数交换,那么要使排列是升序的最少需要交换几次。
思路
贪心
由于是排列,所以排序后第 $i$ 个位置上的数就是 $i$。所以当 $a[0] \neq 0$ 时,把 $a[0]$ 位置上的元素交换到相应位置。如果 $a[0] = 0$,就找到第一个不在正确位置上的数,把它与第 $0$ 个数交换,那么下一次又是第一种情况了,也就是下一次交换可以换到正确的位置。
代码
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
| #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10;
int arr[maxn];
int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; ++i) { cin >> arr[i]; }
int c = 0, cnt = 0; while (c < n) { if (arr[0] != 0) { swap(arr[0], arr[arr[0]]); cnt++; } else { for (; c < n && arr[c] == c; ++c); if (c == n) break; swap(arr[0], arr[c]); cnt++; } } cout << cnt << endl; return 0; }
|