UVA

来源:互联网 发布:mac手势 切换 编辑:程序博客网 时间:2024/06/14 10:55

就是按照一定规则 由当前序列还原为 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;}


1 0