题意:输入一个1~n的序列,【1,300】,用不超过2*n^2次操作把它升序排列成输入的,操作有两种:交换前两个元素;把第一个元素是移动到最后。
分析:因为要把升序序列排列成给定的,所以可以先将给定的序列排列成升序序列,操作再逆序输出,操作1不变,操作2原来是从头部移动到尾部,现在从尾部移动到头部。
#include<iostream>
#include<string>
#include<sstream>
#include<set>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
int n, A[300 + 20];
bool judge() {
for (int i = 0; i < n - 1; i++)
if (A[i] > A[i + 1])return false;
return true;
}
int main() {
while (cin >> n && n) {
vector<int>s;
for (int i = 0; i < n; i++)cin >> A[i];
while (1) {
if (judge())break;
if(A[0]!=n&&A[0]>A[1]){//最小的移动到第一个
s.push_back(1);
swap(A[0], A[1]);
}
else {
int t = A[n - 1];
for (int i = n-1; i >0; i--) {
A[i] = A[i - 1];
}
A[0] = t;
s.push_back(2);
}
}
for (int i = s.size() - 1; i >= 0; i--)cout << s[i];
cout << endl;
}
return 0;
}