2018年全国多校算法寒假训练营练习比赛(第一场) - J - 闯关的lulu(找规律,递归)

时间:2021-06-29 00:15:41
链接:https://www.nowcoder.net/acm/contest/67/J
来源:牛客网

题目描述
    勇者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层时身上的数字
示例1
输入

4
1
2
3
20
输出

0
11
110
32211
备注:
对于100%的数据,
0 < T <= 100
0 < n <= 10^7


题目给出了3的得到,就是每12层 1 个 3 

要猜的就是多少个3可以得到一个4

规律就是:当k>=3时 ,要得到 k+1 需要 k+2 个 k 

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int T,n;
char s[15][10]={"","0","11","110","21","210","22","220","2211","22110","2221","22210",""};
void slove(int k,int cnt){
if(k==0) return;
int base = cnt + 2;
slove(k/base, cnt + 1);
for(int i=1;i<=k%base;i++) printf("%d",cnt);
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
slove(n/12, 3);
printf("%s\n",s[n%12]);
}
return 0;
}