zoukankan      html  css  js  c++  java
  • 1555: Inversion Sequence (通过逆序数复原序列 vector的骚操作!!!)

    1555: Inversion Sequence

          Time Limit: 2 Sec     Memory Limit: 256 Mb     Submitted: 519     Solved: 195    


    Description

    For sequence i1, i2, i3, … , iN, we set aj to be the number of members in the sequence which are prior to j and greater to j at the same time. The sequence a1, a2, a3, … , aN is referred to as the inversion sequence of the original sequence (i1, i2, i3, … , iN). For example, sequence 1, 2, 0, 1, 0 is the inversion sequence of sequence 3, 1, 5, 2, 4. Your task is to find a full permutation of 1~N that is an original sequence of a given inversion sequence. If there is no permutation meets the conditions please output “No solution”.

    Input

    There are several test cases.
    Each test case contains 1 positive integers N in the first line.(1 ≤ N ≤ 10000).
    Followed in the next line is an inversion sequence a1, a2, a3, … , aN (0 ≤ aj < N)
    The input will finish with the end of file.

    Output

    For each case, please output the permutation of 1~N in one line. If there is no permutation meets the conditions, please output “No solution”.

    Sample Input

    5
    1 2 0 1 0
    3
    0 0 0
    2
    1 1

    Sample Output

    3 1 5 2 4
    1 2 3
    No solution

    Hint

    Source

    题目意思:通过逆序数复原序列
    题目意思和样例很难懂
    比如样例1:
    1 2 0 1 0
    1 表示序列中1的前面比1大的数有1个
    2 表示序列中2的前面比2大的数有2个
    0 表示序列中3的前面比3大的数有0个
    1 表示序列中4的前面比4大的数有1个
    0 表示序列中5的前面比5大的数有0个
    解析一下:
    1的前面有1个比1大的,2的前面有2个比2大的,4的前面有一个比4大的
    首先,1的位置可以直接确定,因为除了1以外所有的数都比1大,所以1肯定在第二个位置
    得到 _ 1 _ _ _
    然后考虑2,2的前面有两个数字比2大,因为我们已经确定的数字只有1,1已经比2小了,所以要无视1,其实就是说,2的前面要留下2个空位,这样那2个空位只能放3,4,5,就能保证2的前面一定会有2个数字比它大了,所以
    得到 _ 1 _ 2 _
    再考虑3,3的前面没有比3大的,1和2都比3小应该直接无视,那么3只能放在第一个位置
    得到3 1 _ 2 _
    再考虑4,4的前面有一个比它大,所以4的前面应该留一个空格
    得到3 1 _ 2 4
    最后
    得到3 1 5 2 4
    具体做法:
    采用vector模拟该操作
    很神奇!......
     
    #include<cstdio>
    #include<string>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<set>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<cctype>
    #include<stack>
    #include<sstream>
    #include<list>
    #include<assert.h>
    #include<bitset>
    #include<numeric>
    #define max_v 10005
    using namespace std;
    int a[max_v];
    vector<int> v;
    int main()
    {
        int n;
        while(cin>>n)
        {
            v.clear();
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            int flag=1;
            for(int i=n;i>=1;i--)
            {
                if(v.size()<a[i])
                {
                    flag=0;
                    break;
                }
                v.insert(v.begin()+a[i],i);
            }
            if(flag)
            {
                vector<int>::iterator it;
                it=v.begin();
                printf("%d",*it);
                it++;
                for(;it!=v.end();it++)
                    printf(" %d",*it);
                printf("
    ");
            }else
            {
                printf("No solution
    ");
            }
        }
        return 0;
    }
    /*
    题目意思:通过逆序数复原序列
    题目意思和样例很难懂
    比如样例1:
    1 2 0 1 0
    1 表示序列中1的前面比1大的数有1个
    2 表示序列中2的前面比2大的数有2个
    0 表示序列中3的前面比3大的数有0个
    1 表示序列中4的前面比4大的数有1个
    0 表示序列中5的前面比5大的数有0个
    
    解析一下:
    
    1的前面有1个比1大的,2的前面有2个比2大的,4的前面有一个比4大的 
    
    首先,1的位置可以直接确定,因为除了1以外所有的数都比1大,所以1肯定在第二个位置
    得到 _ 1 _ _ _
    然后考虑2,2的前面有两个数字比2大,因为我们已经确定的数字只有1,1已经比2小了,所以要无视1,其实就是说,2的前面要留下2个空位,这样那2个空位只能放3,4,5,就能保证2的前面一定会有2个数字比它大了,所以
    得到 _ 1 _ 2 _
    再考虑3,3的前面没有比3大的,1和2都比3小应该直接无视,那么3只能放在第一个位置
    得到3 1 _ 2 _
    再考虑4,4的前面有一个比它大,所以4的前面应该留一个空格
    得到3 1 _ 2 4
    最后
    得到3 1 5 2 4
    
    具体做法:
    采用vector模拟该操作
    很神奇!......
    
    */
  • 相关阅读:
    什么是restful风格?
    android中设置控件获得焦点
    Android中Parcelable的原理和使用方法
    webstorm快捷键大全
    HTTP状态码
    三行代码写爬虫
    HTTrackPortable
    安装mac系统
    Vue常用的操作指令
    什么样的人不适合当程序员呢?
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9498752.html
Copyright © 2011-2022 走看看