Algoritmo para mejorar la ceremonia de apertura olímpica

Descripción del problema

La escuela asignó un lugar a la primera (tercera) clase de la escuela secundaria para participar en la ceremonia de apertura de los Juegos Olímpicos. Todos están compitiendo por ir, pero solo hay un lugar, ¿qué debo hacer? El monitor ideó una manera de hacer que todos los estudiantes de la clase (n estudiantes en total) formen un círculo y los numeren en el sentido de las agujas del reloj. Luego, seleccione al azar un número m, e informe el número en el sentido de las agujas del reloj comenzando por el 1er alumno, 1, 2,…, m Todos los alumnos que se reporten a m deben abandonar voluntariamente el círculo. Luego, en el sentido de las agujas del reloj, una por una, la persona que informó m fuera del círculo, la última persona que queda es la persona que asistió a la ceremonia de apertura.

Reclamación

Utilice el método de lista enlazada circular para resolver . La llamada lista vinculada circular significa que para el nodo final de la lista vinculada, el siguiente puntero apunta al primer nodo de la lista vinculada. La idea básica es crear primero una lista enlazada circular para simular la situación en la que los estudiantes forman un círculo. Luego ingrese al enlace de eliminación de ciclo, simule reportar el número de 1 a my deje que un compañero de clase (nodo) salga del círculo cada vez.

Formato de entrada

La entrada es solo una línea, incluidos dos números enteros nym, donde nym tienen el mismo significado que el anterior.

Formato de salida

La salida es solo un número entero, el número de la persona que asiste a la ceremonia de apertura.

Entrada y salida de muestra

Entrada de muestra
8 3
Salida de muestra
7

responder

Antes de que emm no analizara los requisitos específicos, se utilizó el método de tomar el resto de la matriz para resolver el problema de la siguiente manera:

import java.util.Scanner;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < nums.length; i++) {
    
    
            nums[i] = i+1;
        }
        // 辅助
        int index = 0;
        // 淘汰人数
        int out = 0;
        while (out < n-1) {
    
    
            int temp = 0;
            while (temp < m) {
    
    
                if (nums[index] != 0) temp++;
                index = (++index)%n;
            }
            if (index != 0)
                nums[index-1] = 0;
            else nums[n-1] = 0;
            out++;
        }
        for (int i = 0; i < nums.length; i++) {
    
    
            if (nums[i] != 0) {
    
    
                System.out.print(nums[i]);
                break;
            }
        }
    }
}

Luego, escriba una lista enlazada circular unidireccional, de la siguiente manera:

import java.util.Scanner;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        // 读入数据
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        scanner.close();
        // 初始化
        CircleLink circleLink = new CircleLink(1);
        for (int i = 2; i <= n; i++) {
    
    
            circleLink.addNode(i);
        }
        // 开始循环去除
        Node temp = circleLink.getFirst();
        while (circleLink.getSize() > 1) {
    
    
            for (int i = 1; i < m; i++) {
    
    
                temp = temp.getNext();
            }
            circleLink.deleteNode(temp);
            temp = temp.getNext();
        }
        // 输出参加者
        System.out.println(circleLink.getFirst().getValue());
    }
}

/**
 * 单向环形链表节点
 */
class Node {
    
    
    private int value = 0;
    private Node next = null;

    public Node() {
    
    
    }

    public Node(int value) {
    
    
        this.value = value;
    }

    public int getValue() {
    
    
        return value;
    }

    public void setValue(int value) {
    
    
        this.value = value;
    }

    public Node getNext() {
    
    
        return next;
    }

    public void setNext(Node next) {
    
    
        this.next = next;
    }
}

/**
 * 单向环形链表
 */
class CircleLink {
    
    
    private Node first = null;
    private int size = 0;

    public CircleLink(int value) {
    
    
        first = new Node(value);
        first.setNext(first);
        size = 1;
    }

    /**
     * 添加
     * @param value
     */
    public void addNode(int value) {
    
    
        Node temp = first;
        // 走到链尾
        while (temp.getNext() != first) temp = temp.getNext();
        Node node = new Node(value);
        temp.setNext(node);
        node.setNext(first);
        size++;
    }

    /**
     * 删除
     * @param node
     */
    public void deleteNode(Node node) {
    
    
        Node temp = first;
        while (temp.getNext() != node) temp = temp.getNext();
        if (node == first) {
    
    
            first = node.getNext();
        }
        temp.setNext(node.getNext());
        size--;
    }

    public Node getFirst() {
    
    
        return first;
    }

    public int getSize() {
    
    
        return size;
    }
}

Supongo que te gusta

Origin blog.csdn.net/L333333333/article/details/104087489
Recomendado
Clasificación