Preguntas de la prueba anterior de Blue Bridge Cup: Implementación de caramelos en Java

Tema Descripción

Hay n niños sentados en círculo. El maestro distribuye al azar un número par de dulces a cada niño y luego juega el siguiente juego:

Cada niño distribuye la mitad de sus dulces al niño de la izquierda.
Después de una ronda de distribución de dulces, el maestro le dará 1 dulce al niño con un número impar de dulces, convirtiéndose así en un número par.
Repita este juego hasta que todos los niños tengan la misma cantidad de dulces.
Su tarea es predecir cuántos dulces necesitará volver a entregar el maestro en la situación inicial conocida de dulces.

ingresar

El programa lee primero un número entero N (2< N< 100), indicando el número de niños. 
Luego hay una línea de N números pares separados por espacios (cada número par no es mayor que 1000 ni menor que 2) 

producción

Se requiere que el programa genere un número entero que represente la cantidad de dulces que el maestro debe volver a emitir.

entrada de muestra

3 
2 2 4

salida de muestra

4

Análisis de ideas:

En primer lugar, cuando vi esta pregunta, mi primera reacción fue usar la recursividad. Debido a que necesita ejecutar el mismo contenido cada vez, divida primero y luego compense para juzgar si son iguales.

Luego, en el proceso de escribir código, debe prestar atención a varios problemas:

1. Dividir los dulces de izquierda a derecha, lo entiendo como distribuir los dulces de atrás hacia adelante y luego del primero al último. En este momento, debido a que el estado de los dulces en manos del primer niño se ha compartido con el segundo niño, no podemos usar este valor directamente, así que creé una nueva matriz brr, let brr=arr, luego lo haremos. Puede use brr[0] para reemplazar arr[0] después de la ejecución.

2. Después de juzgar si cada valor en la matriz es igual, debe considerar que la matriz arr ya está ordenada, lo que equivale a alinear a los niños según la cantidad de dulces en sus manos, de pequeños a grandes. Por supuesto, si no son iguales, entonces no es razonable que llevemos la matriz arr a la siguiente ronda de ejecución de código en este momento, por lo que debemos formatear la matriz brr antes de ordenarla, que es completamente igual a la matriz arr . Finalmente, después del juicio, podemos restaurar la matriz arr.

Visualización de código:

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int[] brr = new int[n];
        for (int i=0 ; i<n ; i++) {
            arr[i] = sc.nextInt();
            brr[i] = arr[i];
        }
        int count=0;
        System.out.println(ar(arr,brr,n,count));
    }

    public static int ar(int[] arr,int[] brr,int n,int count) {
        for (int i=0;i<n;i++) {  //转圈互分糖果
            if (i==(n-1)) {
//此时arr[0]已经是和arr[1]互分糖果后的数值,但是我们需要的是原始值,所以借用brr数组
                arr[i] = (arr[i]/2)+(brr[0]/2);
            } else {
                arr[i] = (arr[i]/2)+(arr[i+1]/2);
            }
        }
        for (int i=0;i<n;i++) {  //判断每个人手里的糖果是否为奇数
            if (arr[i]%2!=0) {
                arr[i] = arr[i]+1;
                count ++;
            }
//相当于格式化brr数组,因为我们需要用到brr[0]和下面对arr数组排序之后的恢复
            brr[i] = arr[i]; 
        }
// 对arr数组进行排序,如果收尾相等,则课判断该数组的每一个元素值都是相等的       
        Arrays.sort(arr);
// 如果相等,我们直接输出计数器       
        if (arr[0]==arr[n-1]) {
            return count;
        }
// 如果不相等,我们需要对排序之后的arr数组进行复原,然后循环执行
        for (int i=0;i<n;i++) {
            arr[i] = brr[i];
        }
        return ar(arr,brr,n,count);
    }
}

Estado de evaluación:

 

Supongo que te gusta

Origin blog.csdn.net/aDiaoYa_/article/details/123589392
Recomendado
Clasificación