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

 */

 

posted @ 2018-01-24 14:57  Fighting_Heart  阅读(267)  评论(0编辑  收藏  举报