zoukankan      html  css  js  c++  java
  • 2018年全国多校算法寒假训练营练习比赛(第一场)J

    链接: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("
    ");
      }
      return 0;
    }
    
    /*
     
     00   ->  1
     111  ->  2
     2222 ->  3
     
     + 0
     + 10
     + 0
     + 10
     + 0
     + 10
     + 0
     + 10
     + 0
     + 10
     + 0
     + 10
    
     */
    
  • 相关阅读:
    完全背包详解
    0-1背包详解
    优先队列 + 模拟
    循环节 + 矩阵快速幂
    并查集 + 路径压缩(经典) UVALive 3027 Corporative Network
    dp
    动态规划分类(完整版)
    (二)Spring框架之JDBC的基本使用(p6spy插件的使用)
    (一)Spring框架基础
    (十六)客户端验证与struts2中的服务器端验证
  • 原文地址:https://www.cnblogs.com/zufezzt/p/8341670.html
Copyright © 2011-2022 走看看