Fácil–medio · Arrays

Máximo de un array

Lee N, luego N números, e imprime el mayor. Toma la idea del máximo corrido de El mayor de tres y la escala a cualquier cantidad — la forma exacta de mil problemas futuros.

En una fraseLee N números en un array y mantén un máximo acumulado empezando por el primer elemento: inicializarlo en 0 falla con un array todo negativo.

El problema

Entrada: la primera línea trae N (1 ≤ N ≤ 1000); la segunda, N enteros.

Salida: el mayor de ellos.

Ejemplos:

EntradaSalida
5
3 9 1 7 4
9
4
-3 -7 -1 -9
-1

Tu solución

main.cpp — tu solución
Entrada personalizada para «Ejecutar mi entrada»

La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.

¿Atascado? Pistas

Pista 1 — dos arquitecturas válidas

Opción A: leer todo a int a[1000] y luego recorrer buscando el máximo. Opción B: sin array — un máximo corrido mientras lees (cin >> a; dentro del bucle). Las dos pasan; B usa memoria O(1). Saber cuándo no necesitas guardar los datos es una habilidad algorítmica de verdad.

Pista 2 — inicializar el máximo

Inicia con el primer valor, jamás con 0 — el juez incluye entradas todo-negativas donde un 0 inicial reporta un número que nunca estuvo en los datos. (La misma trampa de El mayor de tres, ahora con más espacio para morder.)

Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int m, a;
    cin >> m;                 // first value seeds the maximum
    for (int i = 1; i < n; i++) {
        cin >> a;
        if (a > m) m = a;
    }
    cout << m << endl;
    return 0;
}

Metas extra: imprimir la posición del máximo (recuerda el índice al actualizar), o el mínimo y el máximo, o la suma y la media — cuidado: la media tropieza con la trampa de la división entera. Siguiente nivel: Contar pares e impares.

Análisis profundo

Por qué funciona

Un máximo corrido sobre un flujo necesita O(1) de memoria: nunca hace falta guardar el array. Esa es la idea que buscan en una entrevista.

El coste

O(n) de tiempo y O(1) de espacio extra, aunque la entrada sea O(n).

Dónde falla

  • Declarar un array fijo de 100 cuando el problema admite 1.000 es un desbordamiento de pila esperando. Procesa en flujo si puedes.
  • Guardar la posición exige una segunda variable; si olvidas actualizarla tienes el valor pero no el índice.

Siguiente paso

Contar en vez de comparar: Contar pares e impares.

Dos cosas para recordar

  • Un máximo corrido no necesita array.
  • O(n) de tiempo no obliga a O(n) de memoria.
🐞 Esta versión falla: ábrela y pruébala

El máximo arranca en 0 en vez de en el primer elemento

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int best = 0;
    for (int i = 0; i < n; i++) {
        int v;
        cin >> v;
        if (v > best) best = v;
    }
    cout << best << endl;
    return 0;
}