[Niu Ke] J. Lulu qui franchit le niveau

Concours de pratique du camp d'entraînement des vacances d'hiver de l'algorithme multi-école Niuke 2018 (premier tour)

Description du titre
  Un jour, le courageux Lulu est entré dans une tour de 10 000 000 étages. Chaque fois qu'il atteignait un étage de la tour, il obtenait un nombre correspondant de 0 et 1 (selon la situation). Ensuite, il y a une règle dans la tour Lorsqu'un nombre atteint un nombre spécifique, ils seront combinés dans le nombre suivant. Maintenant, la question est, lorsque Lulu atteint le nième étage à partir du 1er étage, quel nombre est sur lui.

1er étage 0
2e étage 11
3e étage 110
4e étage 21
5e étage 210
6e étage 22
7e étage 220
8e étage 2211
9e étage 22110
10e étage 2221 11e
étage 22210
12e étage 3

Description de l'entrée :
La première ligne est le nombre d'échantillons T (T<100),
et la seconde à 2+T-1 lignes ont chacune un entier n (0<n<= 1 0 7 10^71 07)。

Description de la sortie : de grande à petite, sortie de l'exemple d'entrée
numérique de lulu lorsqu'elle atteint la nième couche

4
1
2
3
20

sortir

0
11
110
32211

Remarque :
Pour des données à 100 %,
0 < T <= 100
0 < n <= 1 0 7 10^71 07

répondre

En analysant l'exemple, deux 0 forment un 1, trois 1 forment un 2 et quatre 2 forment un 3. Ensuite, à partir de la première couche, les couches impaires ont un 0 de plus et les couches paires en ont un. plus 0 et un 1.
Idée : convertissez d'abord la nième couche en un nombre de tous les 0, puis modulo un par un, puis divisez, modulo à nouveau, divisez à nouveau, etc.

import java.util.*;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        //v[i]记录 i 需要在结果出现几次
        int[] v = new int[10005];
        //T个样例
        for (int count = 0; count < T; count++) {
    
    
            //第n层
            int n = in.nextInt();

            //转为0的个数
            int zerosum = n + (n / 2) * 2;
            // System.out.println("zeroCount: "+zerosum);

            int i = 1;
            while (zerosum != 0) {
    
    
                //从2开始取余
                i++;
                v[i - 2] = zerosum % i;
                zerosum /= i;
            }
            // System.out.println("i: "+i);

            //倒序输出
            for (; i >= 0; i--) {
    
    
                //v[i]是几就输出几次
                while (v[i] > 0) {
    
    
                    System.out.print(i);
                    v[i]--;
                }
            }
            System.out.println();
        }
    }
}

Solution 2 :
Convertissez directement sans passer à tous les 0, en commençant par les 0 et les 1 :

import java.util.*;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        //T个样例
        for (int count = 0; count < T; count++) {
    
    
            //到达第n层
            int n = in.nextInt();
            int i, x, j, k;
            //存储每个数字有几个,v0表示0的个数,v1表示1的个数
            int[] v = new int[10005];
            //第n层有n个0,n / 2个1
            v[0] += n;
            v[1] += n / 2;
            //i记录合成的数字,逐次累加从0开始,x表示合成的个数,例如2个0能够合成1
            i = 0;
            x = 2;
            while (true) {
    
    
                //如果条件不成立,说明这个数字的个数大于合成需要的个数,需要执行合成
                if (v[i] / x == 0) {
    
    
                    break;
                }
                v[i + 1] += v[i] / x;
                v[i] %= x;
                x++;
                i++;
            }
            
            //输出
            //外层循环表示输出哪个数字,从最大到0依次递减
            for (j = i; j >= 0; j--) {
    
    
                //内层表示输出几个数字
                for (k = 0; k < v[j]; k++) {
    
    
                    System.out.print(j);
                }
            }
            System.out.println();
        }
    }
}

Guess you like

Origin blog.csdn.net/qq_44033208/article/details/131861495