HDU5122

HDU5122

1. Enlace de tema

Enlace de tema

En segundo lugar, el tema

Nervending es un ACMer.
Ayer, NE aprendió un algoritmo: clasificación de burbujas. La clasificación de burbujas comparará cada par de elementos adyacentes y los intercambiará si están en el orden incorrecto. El proceso se repite hasta que no se necesita ningún cambio.
Hoy, NE presenta un nuevo algoritmo y lo llama Strange Sorting.
Hay muchas rondas en Strange Sorting. Para cada ronda, NE elige un número y sigue intercambiándolo con su siguiente número mientras que el siguiente número es menor. Por ejemplo, si la secuencia es "1 4 3 2 5", y NE elige "4", obtendrá "1 3 2 4 5" después de esta ronda. La clasificación extraña es similar a la clasificación de burbujas, pero es un algoritmo aleatorio porque NE elegirá un número aleatorio al comienzo de cada ronda. NE quiere saber que, para una secuencia dada, cuántas rondas se necesitan para ordenar esta secuencia en la mejor situación. En otras palabras, debe responder el número mínimo de rondas necesarias para ordenar la secuencia en orden ascendente. Para simplificar el problema, NE promete que la secuencia es una permutación de 1, 2,. . . , N.

Traducción:

Nervending es un ACMer.
Ayer, NE aprendió un algoritmo: clasificación de burbujas. La clasificación de burbujas comparará cada par de elementos adyacentes y los intercambiará si el orden es incorrecto. Repita el proceso hasta que no sea necesario cambiarlo.
Hoy, NE propuso un nuevo algoritmo y lo llamó "Ordenación extraña".
Hay muchas rondas en una clasificación extraña. Para cada ronda, NE elegirá un número y continuará intercambiándolo con el siguiente número cuando el siguiente número sea menor que ese número. Por ejemplo, si la secuencia es "1 4 3 2 5" y NE elige "4", obtendrá "1 3 2 4 5" después de esta ronda. La clasificación extraña es similar a la clasificación de burbujas, pero es un algoritmo aleatorio porque el elemento de red elige un número aleatorio al comienzo de cada ronda. NE necesita saber, para una secuencia dada, cuántas rondas se necesitan para ordenar la secuencia en el mejor de los casos. En otras palabras, debe responder el número mínimo de rondas necesarias para ordenar la secuencia en orden ascendente. Para simplificar el problema, la secuencia de compromiso de NE es una secuencia de 1, 2, .... . . , N.

Entrada

La primera línea contiene solo un número entero T (T ≤ 200), que indica el número de casos de prueba. Para cada caso de prueba, la primera línea contiene un número entero N (1 ≤ N ≤ 10 6 ).
La segunda línea contiene N números enteros ai (1 ≤ ai ≤ N), que denota la secuencia que NE le da.
La suma de N en todos los casos de prueba no excedería de 3 × 10 6 .

Salida

Para cada caso de prueba, envíe una sola línea "Caso #x: y", donde x es el número de caso (comenzando desde 1), y es el número mínimo de rondas necesarias para ordenar la secuencia.

Entrada de muestra

2
5
5 4 3 2 1
5
5 1 2 3 4

Salida de muestra

Caso # 1: 4
Caso # 2: 1

Tres, la pregunta se desmonta

  • En primer lugar, sabemos que lo que tenemos que hacer es calcular la ronda mínima de un tipo, luego veamos el contenido aproximado del título:

Para cada ronda, NE elegirá un número y continuará intercambiándolo con el siguiente número cuando el siguiente número sea menor que ese número. Por ejemplo, si la secuencia es "1 4 3 2 5" y NE elige "4", obtendrá "1 3 2 4 5" después de esta ronda.

  • Qué significa eso? Cuando elegimos un número, este número siempre se intercambiará con un número menor que él en esta ronda, de modo que el número en esta ronda asegurará que el número detrás de él sea mayor que él.
  • Una cosa a tener en cuenta aquí es soloEl número detrás de élMás grande que eso, no todos los números detrás de él.
  • ¡es bueno! Luego miramos los siguientes temas:

La clasificación extraña es similar a la clasificación de burbujas, pero es un algoritmo aleatorio porque el elemento de red elige un número aleatorio al comienzo de cada ronda. NE necesita saber, para una secuencia dada, cuántas rondas se necesitan para ordenar la secuencia en el mejor de los casos. En otras palabras, debe responder el número mínimo de rondas necesarias para ordenar la secuencia en orden ascendente.

  • El significado del título aquí es obvio. Necesitamos encontrar una manera de seleccionar números para que se convierta en una secuencia ascendente con la ronda más pequeña.
  • rango de datos

T ≤ 200
1 ≤ N ≤ 10 6
Suma de datos <= 3 × 10 6

Cuatro, ideas para resolver problemas

  • Ahora, intentemos analizar la lógica de trabajo del "tipo extraño" en el título:
  1. Elige un número al azar
  2. Haz que se "hunda" hasta que encuentres un número mayor que él.
  3. Repita los pasos 1-2 hasta que la secuencia se convierta en una secuencia ascendente.
  • Entonces, ¿cómo podemos minimizar esta ronda?
    Es muy simple. Seleccionamos el elemento más grande en la matriz en cada ronda, por lo que incluso la ronda más grande es solo n veces
  • Entonces, ¿cómo calculamos esta ronda mínima?
    Primero, necesitamos determinar qué números en la matriz necesitan "hundirse" y averiguar el número de estos números, que es el número mínimo de rondas que necesitamos. Entonces, ¿cómo debemos encontrar el número de estos números?
  • ¿Cuál es la razón por la que un número necesita "hundirse" en la matriz? Es que hay números "más claros" debajo de él, por lo que solo necesitamos ver qué números tienen números "más claros" debajo.
    Ideas específicas
  • Recorra desde el último dígito de la matriz hasta el encabezado de la matriz, registre el número más pequeño en la posición actual de la matriz y cuando el número actual sea mayor que el número más pequeño, redondee +1.
  • Por ejemplo:
    5 4 3 1 2
    Definimos una suma redonda, que se inicializa en 0. Defina el número mínimo actual min de una matriz para que sea igual al último dígito de la matriz, y luego recorra de atrás hacia adelante desde el penúltimo dígito de la matriz.
  • i = 1, escanear a 1, min = 2 <1, actualizar min, en este momento min = 1, suma = 0
  • i = 2, escanear a 3, min = 1> 3, el número necesita hundirse, suma ++, min no cambia, la clasificación de la matriz es 5 4 1 2 3
  • i = 3, escanear a 4, min = 1> 4, sumidero de números, suma ++
  • i = 4, escanear a 5, min> 5, sumidero de números, suma ++
  • Suma de resultado de salida = 3

Cinco, el código

#include "iostream"
using namespace std;
int main()
{
    
    
    int n;
    scanf("%d",&n);//输入样例数
    for(int i=1;i<=n;i++)
    {
    
    
        int t;//数组大小
        scanf("%d",&t);
        int a[t+5];
        for(int g=0;g<t;g++)
        {
    
    
            scanf("%d",&a[g]);//用scanf可以防止数据过多超时
        }
        int sum=0;//定义轮次
        int mnum=a[t-1];//定义当前最小数字,使其等于数组末尾数字
        for(int g=t-2;g>=0;g--)
        {
    
    
            if(a[g]>mnum)//如果当前数字大于最小数字,说明数字需要下沉
            {
    
    
                sum++;
            } else//如果不需要下沉,更新最小数
            {
    
    
                mnum=a[g];
            }
        }
        printf("Case #%d: %d\n",i,sum);
    }
}

  • El punto a tener en cuenta es que no usa cin para enchufar al mismo tiempo

ios :: sync_with_stdio (falso);

  • Si se agota el tiempo de espera, se recomienda utilizar scanf para ingresar datos.

Supongo que te gusta

Origin blog.csdn.net/Verber/article/details/112907593
Recomendado
Clasificación