CF743B Chloe and the sequence 题解 递归

题目链接:http://codeforces.com/problemset/problem/743/B

题目描述

灵灵最近发明了一个序列,他称他的序列为 \(n-\)序列。
对于一个 \(n-\)序列,如果 \(n=0\) ,那么它是一个空的序列(也就是说空序列中没有元素)。
然后他会进行 \(i\) 次操作,每次操作,他会在原序列末尾添加一次原序列,并且在两个原序列之间插入一个值为 \(i\) 的元素。
比如:
\(n = 0\) 时,\(0-\) 序列为 \([]\)
\(n = 1\) 时,\(1-\) 序列为 \([] + 1 + [] = [ 1 ]\)
\(n = 2\) 时,\(2-\) 序列为 \([ 1 ] + 2 + [ 1 ] = [ 1, 2, 1 ]\)
\(n = 3\) 时,\(3-\) 序列为 \([ 1, 2, 1 ] + 3 + [ 1, 2, 1 ] = [ 1, 2, 1, 3, 1, 2, 1 ]\)
…………

现在我们的题目要求,给你一个 \(n-\) 序列,求出它的第 \(k\) 个元素。
比如,\(3-\) 序列 的 第 \(2\) 个元素是 \(2\)

输入格式

输入包含两个整数 \(n\)\(k\)\(1 \le n \le 50, 1 \le k \lt 2^n\) )。

输出格式

输出 \(n-\) 序列 中的第 \(k\) 个元素的值。

样例输入1

3 2

样例输出1

2

样例输入2

4 8

样例输出2

4

样例解释

对于样例1,一个 \(3-\) 序列 \([1, 2, 1, 3, 1, 2, 1]\) 的第 \(2\) 个元素是 \(2\)
对于样例2,一个 \(4-\) 序列 \([1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1]\) 的第 \(8\) 个元素是 \(4\)

样例分析

这道题目是一道非常经典的递归的题目。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 51;

int n, ans;
long long k, f[maxn];

void init() {
    f[1] = 1;
    for (int i = 1; i < maxn; i ++) f[i] = f[i-1] * 2 + 1;
}

void solve(int n, long long k) {
    if (k == f[n-1] + 1) ans = n;
    else if (k <= f[n-1]) solve(n-1, k);
    else solve(n-1, k - f[n-1] - 1);
}

int main() {
    init();
    cin >> n >> k;
    solve(n, k);
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/quanjun/p/12206352.html
今日推荐