2019牛客暑期多校训练营(第十场场)_B题Coffee Chicken

题目链接: https://ac.nowcoder.com/acm/contest/890/B

这道题,原本没什么思路,但听队友一提类似斐波那契数列,emmmmm,我看了一篇博客(也是关于斐波那契字符串的题目),突然就知道怎么写了(博客:https://blog.csdn.net/weixin_44405344/article/details/88379483)

思路

第n个字符串,它的前一半是第n - 2 个字符串, 后一半是第n - 1个字符串,而我们要找的是[k, k + 9] 这一段字符串, 所以我们知道有三种情况 :

  • 这段字符串全在第n-2个字符串中
  • 这段字符串全在第n-1个字符串中
  • 一部分在第n-2个字符串中,反之另一部分在n-1中]

所以我们可以递归一直往前推,最终从第一个,第二个字符串中找到我们要找的字符串

代码

#include <bits/stdc++.h>
using namespace std;
string s[50];
long long len[100];
void init()
{
    s[1] = "COFFEE";
    s[2] = "CHICKEN";
    //预处理好1-57, 字符串的长度
    len[1] = 6;
    len[2] = 7;
    for(int i = 3; i <= 57; i++){
        len[i] = len[i - 1] + len[i - 2];
    }
}
void f(int n, long long l, long long r)
{
    if(n <= 2){
        cout << s[n].substr(l - 1, (r - l + 1));
        return ;
    }
    if(len[n - 2] > r){
        f(n - 2, l, r);
    }
    else if(len[n - 2] < l){
        f(n - 1, l - len[n - 2], r - len[n - 2]);
    }
    else{
        f(n - 2, l, len[n - 2]);
        f(n - 1, 1, r - len[n - 2]);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    init();
    int n;
    while(cin >> n){
        int m;
        long long k;
        for(int i = 1; i <= n; i++){
            cin >> m >> k;
            if(m >= 56){
                // 大于等于56时, k == 1e12
                //奇数项和偶数项开头不一样
                if(m % 2) m = 57;
                else m = 56;
            }
            f(m, k, k + 9);
            cout << endl;
        }
    }
    return 0;
}
发布了27 篇原创文章 · 获赞 5 · 访问量 2498

猜你喜欢

转载自blog.csdn.net/HKer_YM/article/details/99791482