闯关的lulu (有趣的规律题)

此处传送门

闯关的lulu

勇者lulu某天进入了一个高度10,000,000层的闯关塔,在塔里每到一层楼,他都会获得对应数量的0 1(看情况获得),然后塔里有一个法则,当你身上某个数字达到一个特定的数量时,它们会合成为下一个数字,现在问题来了,当lulu从1层到达第n层的时候,他身上的数字是多少。
第1层 0
第2层 11
第3层 110
第4层 21
第5层 210
第6层 22
第7层 220
第8层 2211
第9层 22110
第10层 2221
第11层 22210
第12层 3

输入描述:

第一行是样例数T(T<100)
第2到2+T-1行每行有一个整数n(0 < n <= 10^7)。

输出描述:

从大到小输出lulu到达第n层时身上的数字

牛客网的2018年全国多校算法寒假训练营练习比赛(第一场)的J题。。都是模拟题,但挺有趣!

题意:

从样例分析一波,然后找出规律,输一个n,输出对应的数字。

想法:

分析分析样例就能发现,两个0组成一个1,三个1组成1个2,4个2组成一个3,然后从第一层开始,奇数层多一个0,偶数层多一个0和一个1,题意猜对了就很好写了。

#include <iostream>

using namespace std;

int main()
{
    int t;

    cin >> t;
    while(t--)
    {
        int n;
        int i;
        int x;
        int j;
        int k;
        int v[10005];
        memset(v, 0, sizeof(v));

        cin >> n;
        v[0] += n;
        v[1] += n/2;
        i = 0;
        x = 2;
        while(1)
        {
            if(v[i]/x == 0)
            {
                break;
            }
            v[i+1] += v[i]/x;
            v[i] %= x;
            x++;
            i++;
        }
        for(j = i; j >= 0; j--)
        {
            for(k = 0; k < v[j]; k++)
            {
                cout << j;
            }
        }
        cout << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiaotudeluobo/article/details/79130094