UVa 1611 - Crane [构造法]
这道题有点像翻煎饼那题,方法不限,只要次数在9^6之内即可。
从前到后依此选择数,最多只需要两次就可以将每个数放到正确位置。
#include <bits/stdc++.h> using namespace std; int a[10240]; void change(const int l, const int r){ for(int i = l, j = l+(r+1-l)/2; j <= r; ++i, ++j) swap(a[i], a[j]); } int main(){ int T; cin >> T; while (T--){ int n; cin >> n; vector<pair<int, int>> Road; for(int i = 0; i < n; ++i) cin >> a[i]; for(int i = 0; i < n; ++i){ int pos = find(a, a + n, i + 1) - a; if(pos == i) continue; if(i + 2*(pos-i) <= n){ Road.push_back(make_pair(i+1, i + 2*(pos-i))); change(i, i + 2*(pos-i) - 1); } else{ if((pos-i)%2){ Road.push_back(make_pair(i+1, pos + 1)); change(i, pos); } else{ Road.push_back(make_pair(i+2, pos + 1)); change(i + 1, pos); } --i; } } cout << Road.size() << endl; for(auto i : Road) printf("%d %d\n", i.first, i.second); } return 0; }