Beihu excavando | Siente el encanto de los algoritmos

4. Excavación de North Lake

Los grados 10 hora de apertura Lunes, 7 de septiembre de 2020 09:00
descuento 0,8 Tiempo de descuento Martes, 15 de septiembre de 2020 09:00
Se permite la presentación tardía No Hora de cierre Sábado, 10 de octubre de 2020 23:00

Descripción

Hace once años, Beihu solía ser un terreno plano y el equipo de construcción de Beihu planeó cavarlo en un pozo profundo e inyectar agua para crear un lago artificial.

Para simplificar el cálculo, asumimos que el suelo del lago Beihu es unidimensional y que cada pieza tiene un ancho de 1 y una altura de un número entero no negativo. Entonces, se puede usar una matriz para expresar una pieza de suelo.

Al principio, el lago del norte era una tierra plana y la altura de cada pieza era aproximadamente h. La siguiente figura muestra h = 3la situación, representada por una matriz como [3,3,3,3,3,3,3,3,3,3,3,3].

El equipo de construcción quería cavarlo en una forma irregular de acuerdo con el dibujo.Como se muestra en la figura siguiente, la matriz se representa como [0,1,0,2,1,0,1,3,2,1,2,1].

El equipo de construcción tiene una excavadora y la excavadora puede excavar un bloque de tierra en una sección continua todos los días. El contratista, Xiao Zhang, quiere completar la tarea lo antes posible. Por favor, dígale cuántos días llevará excavar el terreno plano en la situación que se muestra en el dibujo.

Entrada

Ingrese dos números enteros en la primera línea n (1 \ leq n \ leq 100000), h (1 \ leq h \ leq 1000000). Representa el ancho total de North Lake y la altura de cada bloque inicial.

norteUn número entero en la siguiente línea a_i (0 \ leq a_i \ leq h)representa la altura de cada posición en el dibujo.

Salida

Un número entero significa que Beihu se puede extraer en al menos unos días.

Notas

El intervalo de excavación de 9 días es [1,7], [1,3], [5,7], [1,1], [3,3], [6,6], [9,12], [ 10,10], [12,12].

 

  Entrada de prueba Rendimiento esperado límite de tiempo Limite de memoria Proceso extra
Caso de prueba 1 Mostrar como texto
  1. 12 3↵
  2. 0 1 0 2 1 0 1 3 2 1 2 1↵
Mostrar como texto
  1. 9↵
1 segundo Los 64M 0

       Esta cuestión de violencia y dicotomía será breve (tiempo de espera), entonces necesitamos una forma más inteligente de reducir la complejidad del tiempo de nuestro código:

       Para el caso de uso dado en la pregunta, la parte que debemos investigar es la siguiente:

       Para la conveniencia de pensar, consideraremos la imagen de arriba al revés , no se preocupe, los resultados de tal consideración definitivamente serán los mismos. La altura de cada lugar que se debe excavar se puede calcular y almacenar en una matriz : [3, 2, 3, 1, 2, 3, 2, 0, 1, 2, 1, 2].

       Inicialmente, establecimos el número de días de construcción a la altura del primer bloque a excavar. Como se muestra en la figura anterior, días = 3.

       Luego, comenzamos con el segundo bloque y consideramos a su vez de izquierda a derecha:

  • Si la altura actual a excavar es menor que la anterior , entonces el tiempo de construcción de esta se puede completar antes (la excavadora puede excavar un bloque de suelo en un intervalo continuo todos los días ), no es necesario agregar el actual. Tiempo .
  • Si la altura actual a excavar es mayor que el día anterior , entonces necesitamos agregar tiempo , días + = la diferencia de altura entre los dos.

       Por ejemplo, en el caso de uso anterior, nuestro proceso de algoritmo se muestra en la figura:

El método es muy simple, pero esta forma de pensar es difícil de pensar. El código no es difícil, solo ve al código:

Oh, sí, recuerde usar long long int como el tipo de datos, de lo contrario puede deberse a un desbordamiento de números ...

#include <stdio.h>

#define LEN 100005

long long h[LEN];  //每一处需要挖去的高度

int main() {
    long long wid, height;
    scanf("%lld %lld", &wid, &height);

    for(long long i = 0; i < wid; i++) {
        long long cur;
        scanf("%lld", &cur);  //输入最终要求的高度
        h[i] = height - cur;  //计算每一处需要挖去的高度
    }

    long long ans = h[0];  //初始天数
    for(long long i = 1; i < wid; i++) {
        if(h[i] > h[i - 1]) 
            ans += h[i] - h[i - 1];  //加时
    }

    printf("%lld\n", ans);
}


Bienvenido a prestar atención a la cuenta pública personal "  Programación de ala de pollo" , aquí hay un granjero de código serio y de buen comportamiento.

---- Sea el blogger más educado y el programador más sólido ----

Trate de escribir cada artículo con cuidado y, por lo general, resuma las notas en actualizaciones automáticas ~

Inserte la descripción de la imagen aquí

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43787043/article/details/108481712
Recomendado
Clasificación