闯关的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
这道题其实规律不是我自己找出来的
当时还在比赛的时候czc说了一下他找到的规律 当时一下觉得不知道怎么实现 时间也不多了我就没写
今天来补了一下
很简单的方法 还是写了很久 感觉自己真的逻辑很不清楚
今天写的时候有写了一下思路 但是感觉还是有点乱
以后写的清楚一点?
不知道要怎么表达啊
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int t,n;
const int maxn = 1e7;
int num[10000003];
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int now = 1, times = 3;
num[0] = n % 2;
int tmp = (n - num[0]) / 2 + n / 2;
num[1] = tmp % 3;
tmp = tmp / 3;
while(tmp){
num[++now] = tmp% (times + 1);
tmp = tmp / (times + 1);
times++;
}
for(int i = now; i >= 0; i--){
while(num[i]--){
cout<<i;
}
}
cout<< endl;
}
return 0;
}