zoukankan      html  css  js  c++  java
  • UVa 11925 Generating Permutations (构造法)

    题意:给定一个序列,让你从一个升序列变成该序列,并且只有两种操作,操作1:交换前两个元素,操作2:把第一个元素移动到最后。

    析:一开始的时候吧,不会,还是看的题解,首先是要逆序来做,这样可能好做一点,那么操作1不变,操作2变成把最后一个元素放到最前面。

    就像是冒泡排序一样,如果第一个元素大于第二个,交换顺序,否则就把最后一个元素移动到最前面,但第三个样例就死循环了,我也算过,这样会一直重复某几个状态,

    所以我们要维护第一个值,如果是最大的元素,那么就不让他们交换了。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <iterator>
    
    using namespace std;
    const int maxn = 300 + 5;
    vector<int> ans, a;
    int n;
    
    bool judge(){
        for(int i = 0; i < n; ++i)
            if(a[i] != i+1)  return false;
        return true;
    }
    
    int main(){
        int x;
    //    freopen("in.txt", "r", stdin);
        while(scanf("%d", &n) == 1 && n){
            ans.clear();
            a.clear();
            for(int i = 0; i < n; ++i){ scanf("%d", &x);  a.push_back(x);  }
    
            if(1 == n){  puts("");  continue;  }
            while(true){
                if(judge())  break;
                if(a[0] > a[1] && a[0] != n){
                    swap(a[0], a[1]);
                    ans.push_back(1);
                }
                else{
                    a.insert(a.begin(), a[n-1]);
                    a.resize(n);
                    ans.push_back(2);
                }
            }
    
            for(int i = ans.size()-1; i >= 0; --i)
                printf("%d", ans[i]);
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    oracle日志总结
    UIScrollView,contentOffset,contentInsert的各自特点和区别?
    js动态增加表格
    判断某个对象是不是DOM对象
    IOS 中frame与bounds的区别
    删除重复项,只取其中一条数据
    NSBundle
    React
    HTML5 postMessage 和 onmessage API 详解
    SonarQube
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5608349.html
Copyright © 2011-2022 走看看