就是按照一定规则 由当前序列还原为 1-n 的原数列,,,但是 题目是问 由 原数列到当前序列要经过哪些步骤,,,, 只有 1 2 两种操作
没想到这题过的挺轻松,,,紫书第八章 高效算法 , 本以为这题会卡时间卡掉呢
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 1000;
int a[maxn], n;
vector<int> ans;
bool is_ok(int *a, int m) {
for(int i = 1; i < m; ++i) {
if(a[i] < a[i-1]) return false;
}
return true;
}
void solve() {
ans.clear();
while(1) {
if(is_ok(a, n)) break; // 判断是否可以了 是否要操作1
if(a[0] != n && a[0] > a[1]) {
ans.push_back(1);
swap(a[0], a[1]);
}
if(is_ok(a, n)) break; // 判断是否可以了 是否要操作1
ans.push_back(2);
int t = a[n-1];
for(int i = n-1; i > 0; --i)
a[i] = a[i-1];
a[0] = t;
}
for(int i = (ans.size() - 1); i >= 0; --i) // 很好用的一点 vector 可以下标访问
printf("%d", ans[i]);
printf("\n");
}
int main() {
while(scanf("%d", &n) == 1 && n) {
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
solve();
}
return 0;
}