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:
| Entrada | Salida |
|---|---|
53 9 1 7 4 | 9 |
4-3 -7 -1 -9 | -1 |
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;
}