URAL1081 Binary Lexicographic Sequence(递归)

Posted caomingpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了URAL1081 Binary Lexicographic Sequence(递归)相关的知识,希望对你有一定的参考价值。

URAL 1081. Binary Lexicographic Sequence

Time limit: 0.5 second
Memory limit: 64 MB

Description

Consider all the sequences with length (0 < N < 44), containing only the elements 0 and 1, and no two ones are adjacent (110 is not a valid sequence of length 3, 0101 is a valid sequence of length 4). Write a program which finds the sequence, which is on K-th place (0 < K < 109) in the lexicographically sorted in ascending order collection of the described sequences.

Input

The first line of input contains two positive integers N and K.

Output

Write the found sequence or ?1 if the number K is larger then the number of valid sequences.

Sample

input output
3 1 000

Problem Author: Emil Kelevedzhiev
Problem Source: Winter Mathematical Festival Varna ‘2001 Informatics Tournament

题解

题意

考虑长度为N的数字串,仅仅包含01,且1不能相邻。按照字典序增序求出第K个数字串是什么?如果不存在第K个,输出 -1

思路

首先先求出fib数组来保存对于长度为从1-N的数字串的个数。观察字典序增序的数组情况可以发现规律,当前位置i为1的条件是其K值大于fib[i]的值,所以我们可以每次判断是否大于fib[i]的值来确定当前位置为0还是为1。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;


const int MAXN = 44+5;
int fib[MAXN];
void init()
{
    fib[0]=1;
    fib[1]=2;
    for (int i=2;i<MAXN;i++)
        fib[i] =fib[i-1]+fib[i-2];
}

int ans[MAXN];

int main(){
    int N,K;
    init();
    while(~scanf("%d %d",&N,&K)){
        memset(ans,0,sizeof(ans));
        if(fib[N]<K){
            printf("-1
");
        }else{
            int las = K;
            for (int j=N-1; j>= 0; j--)
                if (fib[j]<las){
                    ans[j] =1;  
                    las =las -fib[j];
                }
            for(int j=N-1;j>=0;j--){
                if(j!=0)    printf("%d",ans[j]);
                else    printf("%d
",ans[j]);
            }
        }
    }
    return 0;
}


以上是关于URAL1081 Binary Lexicographic Sequence(递归)的主要内容,如果未能解决你的问题,请参考以下文章

URAL1018 Binary Apple Tree

URAL-1018 Binary Apple Tree---树形DP

bzoj1814: Ural 1519 Formula 1 2011-12-20

[URAL1519]Formula 1

Ural 1146 Maximum Sum(DP)

URAL 1427 SMS