Estructura de anillo Joseph de mejora avanzada de Zuoshen Clase 2

Tabla de contenido

【Caso 1】

[Descripción del Título]

[Ingrese descripción:]

[Descripción de salida:]

【ingresar】

【Producción】

[Análisis de ideas]

【Código】


【Caso 1】

[Descripción del Título]


Una empresa está reclutando y hay n personas preseleccionadas. El RR.HH. escribe m números enteros positivos A1, A2,..., Am en la pizarra en secuencia, y luego pide a las n personas que formen un círculo y los numeren 0 y 1 en orden en el sentido de las agujas del reloj. ,2,...,n-1. Las reglas de admisión son:
en la primera ronda, a partir de la persona No. 0, se toma el primer número del pizarrón, es decir, los números del pizarrón A1 se toman en orden, es decir, si se usa el número m en En una ronda determinada, la siguiente La primera debe usarse en cada ronda, si la k se usa en una ronda determinada, la k+1 debe usarse en la siguiente ronda (k<m). En cada ronda ,
se usa un número Ax en el orden en el pizarrón, y se eliminan los de la ronda actual. La persona a la que le toca comienza a contar la persona Axth en el sentido de las agujas del reloj. La persona a la que le toca al inicio de la siguiente. ronda es la persona que es eliminada. La siguiente persona eliminada en el sentido de las agujas del reloj se va a casa directamente, por lo que no hay Cuando se cuentan en rondas posteriores, después de n-1 rondas, se admite la última persona que queda, por lo que el número de la última la persona admitida tiene parentesco con (n, m, A1, A2,..., Am).


[Ingrese descripción:]


La primera línea es un número entero positivo N, lo que indica que hay N grupos de parámetros a partir de la segunda línea. Cada línea tiene varios números enteros positivos, que almacenan n, m, A1,..., Am en orden. Hay N líneas en total, que son los N conjuntos de parámetros anteriores.


[Descripción de salida:]


La salida tiene N líneas, cada línea corresponde al número de la persona admitida determinado por el conjunto de parámetros correspondiente. Ejemplo 1:


【ingresar】


1
4 2 3 1


【Producción】


1

[Análisis de ideas]

Primero pensamos que cada vez que se elimina a una persona, el orden se reclasificará, y luego, después de que se eliminen n-1 personas, solo una persona se clasificará como 0. Entonces, ¿podemos obtener su número en la ronda anterior a través del número que clasificó esta vez, el número de Axe eliminado en la ronda anterior y el número total de personas en la ronda anterior? Si podemos obtener el número anterior a través de dicha información, seguimos recurriendo hasta obtener su número inicial y luego devolvemos este número.

0 1 2 3 4
2 3 0 1
0 1 2
0 1
0

Esta tabla simula la situación de eliminación (una simulación simple es eliminar a la tercera persona cada vez). A través de cada eliminación se dibuja la relación correspondiente entre los números antiguos y nuevos. Mire la imagen para saber que es una imagen del mismo. cosa, y luego resumir la tabla y las imágenes. Después de la regla, la función se puede obtener como

F(x) = (x + m) % i; F(x) es el número en la i-ésima ronda, x es el número en la i-1 ronda y m representa la persona con el número seleccionado para ser eliminado en la i-ésima ronda.

Y debido a que la m eliminada en cada ronda es diferente, pero se usa cíclicamente, este cambio debe agregarse durante la recursividad.

【Código】

import java.util.Scanner;

/**
 * @ProjectName: study3
 * @FileName: Ex5
 * @author:HWJ
 * @Data: 2023/9/17 15:23
 */
public class Ex5 {
    static int[] arr;
    static int m;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        for (int i = 0; i < N; i++) {
            int n = input.nextInt();
            m = input.nextInt();
            arr = new int[m];
            for (int j = 0; j < m; j++) {
                arr[j] = input.nextInt();
            }
            System.out.println(getNum(n, 0));
        }

    }

    public static int getNum(int i, int ax) {
        if (i == 1) {
            return 0;
        }
        int x = (getNum(i - 1, ax == m - 1 ? 0 : ax + 1) + arr[ax]) % i;
        return x;

    }

}

Supongo que te gusta

Origin blog.csdn.net/weixin_73936404/article/details/132940869
Recomendado
Clasificación