Pensamiento algorítmico · pares
¿Existe la suma de dos?
El calentamiento clásico de entrevistas. Recorre i por cada elemento, j desde i+1 para no emparejar un número consigo mismo, y comprueba a[i] + a[j] == T.
En una fraseRecorre i por cada elemento y j desde i+1 para no emparejar un número consigo mismo; si algún par suma T imprime yes, y el doble bucle basta para N ≤ 100.
El problema
Entrada: primera línea N (1 ≤ N ≤ 100); segunda línea N enteros; tercera línea el objetivo T.
Salida: yes si alguna dos números distintos suman T, si no no.
Ejemplos:
| Entrada | Salida |
|---|---|
4 | yes |
3 | no |
5 | yes |
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 — índices distintos, no valores distintos
Usa dos índices i y j con j > i. Eso garantiza dos posiciones distintas — así [3, 3] con objetivo 6 todavía cuenta (las posiciones difieren), que es lo que suelen significar "dos números" en estos problemas.
Pista 2 — detente en cuanto sepas
No necesitas probar cada par — en cuanto encuentres uno, imprime yes y terminas. Si los bucles terminan sin coincidencia, imprime no. Una bandera bool evita imprimir dos veces.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
int main() {
int n, t;
cin >> n;
int a[105];
for (int i = 0; i < n; i++) cin >> a[i];
cin >> t;
bool ok = false;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (a[i] + a[j] == t) ok = true;
cout << (ok ? "yes" : "no") << endl;
return 0;
}
Las entrevistas reales piden los índices, o quieren O(N) con un conjunto hash — pero la versión O(N²) es la base. Siguiente: El segundo mayor mantiene la misma idea de "lleva los valores mientras recorres".
Análisis profundo
Por qué funciona
La búsqueda de un par es el ejemplo completo más pequeño de «probar todas las combinaciones»: dos índices, una desigualdad que los mantiene distintos, una comparación. Todo algoritmo O(N²) que veas después es esta forma a escala.
El coste
O(N²) de tiempo (10.000 comprobaciones con N=100: instantáneo), O(N) de espacio para el array. Puedes salir antes del primer acierto, pero el peor caso sigue siendo un recorrido completo.
Dónde falla
- Empezar j en 0 en vez de i+1 permite que un elemento se empareje consigo mismo:
[5]con objetivo 10 respondería yes con un solo elemento. - Imprimir dentro del bucle: sale
yesvarias veces, y en los casosnono sale nada; el juez rechaza esa salida.
Siguiente paso
Pide los índices en vez de yes/no, luego ordena y usa dos punteros: el mismo problema en O(N log N). El segundo mayor mantiene el hábito de «llevar la cuenta mientras recorres».
Dos cosas para recordar
- j empieza en i+1: posiciones distintas, nunca el mismo elemento dos veces.
- Decide y luego imprime una sola vez: imprimir dentro de un bucle de búsqueda multiplica la salida.
🐞 Esta versión falla: ábrela y pruébala
Imprime dentro del bucle: varias líneas yes, y nada en los casos no
#include <iostream>
using namespace std;
int main() {
int n, t;
cin >> n;
int a[105];
for (int i = 0; i < n; i++) cin >> a[i];
cin >> t;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (a[i] + a[j] == t) cout << "yes" << endl; // prints per match
return 0;
}