2018年全国多校算法寒假训练营练习比赛(第一场)J - 闯关的lulu
链接:https://www.nowcoder.com/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
题解
规律,模拟。
可以发现每一层都能够获得一个$0$,偶数层额外获得一个$1$,合成的规律也就可以发现了。
然后模拟合并即可。
#include<bits/stdc++.h> using namespace std; int T; long long n; long long a[50]; int main() { scanf("%d", &T); while(T --) { scanf("%lld", &n); memset(a, 0, sizeof a); a[0] = n; a[1] = n / 2; for(int i = 0; i <= 30; i ++) { a[i + 1] += (a[i] / (i + 2)); a[i] = a[i] % (i + 2); } for(int i = 30; i >= 0; i --) { while(a[i]) { printf("%d", i); a[i] --; } } printf("\n"); } return 0; } /* 00 -> 1 111 -> 2 2222 -> 3 + 0 + 10 + 0 + 10 + 0 + 10 + 0 + 10 + 0 + 10 + 0 + 10 */