PAT Advanced 1067 Sort with Swap(0, i(25 )
题目描述
Input Specification:
Output Specification:
Sample Input:
Sample Output:
解题思路
一开始想复杂了以及循环处理不当导致两个测试点超时。。就是在for循环里面出现idx[i]!=i
时,将idx[i]和idx[0]交换后不要退出循环,应该再次交换0继续循环,否则复杂度很大,因为如果是后面的元素几乎每次都要遍历到N。
Code
- AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
vector<int> idx;
void countSwap(int &res) {
while(idx[0] != 0) {
swap(idx[0], idx[idx[0]]);
res++;
}
}
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int N, temp, cnt = 0, res = 0;
cin >> N;
idx.resize(N+1);
for(int i = 0; i<N; i++) {
cin >> temp;
if(temp != i) cnt++;
idx[temp] = i;
}
countSwap(res);
for(int i = 0; i<N; i++) {
if(idx[i] != i) {
swap(idx[0], idx[i]);
res ++;
countSwap(res);
}
}
cout << res << '\n';
return 0;
}