zoukankan      html  css  js  c++  java
  • 集训第四周(高效算法设计)O题 (构造题)

    A permutation on the integers from 1 to n is, simply put, a particular rearrangement of these integers. Your task is to generate a given permutation from the initial arrangement 1, 2, 3, . . . , n using only two simple operations.

    •  Operation 1: You may swap the first two numbers. For example, this would change the arrangement 3,2,4,5,1 to 2,3,4,5,1.

    • Operation 2: You may move the first number to the end of the arrangement. For example, this would change the arrangement 3,2,4,5,1 to 2,4,5,1,3.

    Input

    The input consists of a number of test cases. Each test case begins with a single integer n between 1 and 300. On the same line, a permutation of integers 1 through n is given where consecutive integers are separated by a single space. Input is terminated by a line containing ‘0’ which should not be processed.

    Output

    For each test case you are to output a string on a single line that describes a sequence of operations. The string itself should consist only of the characters ‘1’ and ‘2’. This string should be such that if we start with the initial arrangement 1, 2, 3, . . . , n − 1, n and successively apply rules 1 and 2 according to the order they appear in the output, then the resulting permutation is identical to the input permutation. The output string does not necessarily need to be the shortest such string, but it must be no longer than 2n 2 characters. If it is possible to generate the permutation using 0 operations, then you may simply output a blank line.

    Sample Input

    3 2 1 3

    3 2 3 1

    4 4 2 3 1

    0

    Sample Output

    1

    2

    12122

    题意:有一组序列,它原来初始排列为1 2 3 4 5。。。。n,经过操作1和操作2的可以变成输入中所给出的序列,要求输出经过了哪一些操作

    如 123经过操作1可得213

    思路:构造法。。。哪有算法可言,幸好题目说道不一定要求输入最少的那一系列操作,那么就为程序寻找一个进行操作1还是操作2的判定条件,条件是不能执行操作1就执行操作2,那么什么时候不能执行操作1呢,答案是前面两个数字有序时,无序时就交换呗,有序时你想换也换不了。。。重点在于这样的判断中有一个特殊情况,那就是如果前面两个数中有1时,那么无论他们有没有序,都不能执行操作1,否则会陷入循环,怎么也得不出结果了

    其余的,模拟吧。。。

    #include"iostream"
    #include"cstdio"
    #include"cstring"
    using namespace std;
    
    const int maxn=300+10;
    
    int a[maxn];
    int n;
    
    string ans;
    
    void swap1()
    {
     int t;
     t=a[0];
     a[0]=a[1];
     a[1]=t;
    }
    
    void swap2()
    {
        int t;
        t=a[n-1];
        for(int i=n-1;i>0;i--)
            {a[i]=a[i-1];}
        a[0]=t;
    }
    
    bool check()
    {
        for(int i=0;i<n;i++)
        {
            if(a[i]!=i+1) return false;
        }
        return true;
    }
    
    void print()
    {
        for(int i=ans.length()-1;i>=0;i--)
        cout<<ans[i];
    }
    
    int main()
    {
        while(cin>>n&&n)
        {
            memset(a,0,sizeof(a));
            ans.clear();
         for(int i=0;i<n;i++)
                cin>>a[i];
                int T=2*n*n;
          while(T--)
             {
                 if(check()) {print();break;}
                 if(a[0]>a[1]&&a[0]!=1&&a[1]!=1) {swap1();ans+='1';}
                 else {swap2();ans+='2';}
             }
             cout<<endl;
         }
        return 0;
    }
  • 相关阅读:
    HTML编码规范(转)
    ASP.NET连接MySQL数据库方法(测试可行)
    Redis源码解析05: 压缩列表
    Redis源码解析04: 跳跃表
    Redis源码解析03: 字典的遍历
    Redis源码解析02: 字典
    Redis源码解析01: 简单动态字符串SDS
    小象垃圾分类小程序从开始到结束
    spring boot踩坑记
    spring boot打包问题
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4707230.html
Copyright © 2011-2022 走看看