Blog

Primeros pasos con problemas de competencias

 En este artículo pretendemos orientar a los nuevos competidores al mundo de las competencias de programación. Al finalizar la lectura, se espera que entiendan la naturaleza y estructura de problemas de programación competitiva, de manera que pueda aplicar efectivamente sus conocimientos de programación para poder resolverlos.

En general, la descripción de cada problema está compuesta por las siguientes secciones:

  1. Descripción del problema
  2. Descripción de la entrada
  3. Descripción de la salida
  4. Ejemplos

 

La descripción del problema especifica qué problema se ha de resolver. En ocasiones esta sección incluye una historia de fondo que ayuda a establecer un contexto. Otras veces, sólo define formalmente el problema a resolver.

La descripción de la entrada define exactamente el formato de los datos de entrada, así como los límites de todas las variables de entrada. Los competidores deben respetar los límites especificados en esta sección. Nunca se suministrarán datos que excedan los límites establecidos. Asimismo, deben tener muy en cuenta que quien evalúa las soluciones es un juez automático (programa de computadora). Nunca se debe adornar la captura de datos con frases como: "Digite la cantidad de ...". Esto sólo producirá un veredicto incorrecto. ¡Mucho ojo con esto!

La descripción de la salida especifica qué y cómo imprimir los resultados. Similar a la entrada, esta data nunca debe adornarse de frases como: "El resultado es...", pues producirá un veredicto incorrecto automáticamente.

Los ejemplos proveen casos de prueba ejemplares que pueden utilizarse para confirmar entendimiento básico del problema en cuestión. Cada caso de prueba de ejemplo muestra una entrada válida y su salida correcta correspondiente. Los competidores deben tener presente que la lista de casos de prueba es usualmente incompleta, y que teniendo una solución que produce salidas correctas para los casos ejemplares no garantiza que la misma esté absolutamente correcta. ¡Ojo!

La entrada y salida deben ser por las vías estándares (consola). A continuación resolveremos este problema en cada uno de los lenguajes permitidos (C, C++, Java, Pascal y Python). En resumen, el problema dice: dada una lista de números enteros positivos, ¿puedes determinar la suma de todos sus números pares? En la primera línea nos darán a N, el tamaño de la lista. La segunda línea contendrá N enteros positivos separados por un espacio. Se garantiza que N oscilará entre 2 y 100 elementos. 

C

#include <stdio.h>
int main() {
    int n, i, suma, temp;
    scanf("%d", &n);
    suma = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &temp);
        if (temp % 2 == 0)
            suma += temp;
    }
    printf("%d", suma);
    return 0;
}

C++

#include <iostream>
int main() {
    int n, suma;
    cin >> n;
    suma = 0;
    for (int i = 0; i < n; i++) {
        int tmp; cin >> tmp;
        if (tmp % 2 == 0)
            suma += tmp;
    }
    cout << suma;
    return 0;
}

Java

import java.io.*;
class Main {
public static void main (String[] args) throws java.lang.Exception
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(reader.readLine()), sum = 0;
String[] nums = reader.readLine().split(" ");
for (int i = 0; i < N; ++i) {
int num = Integer.parseInt(nums[i]);
if (num % 2 == 0) {
sum += num;
}
}
System.out.println(sum);
}
}

Pascal

program OP000001;
var 
n : integer;
actual: integer;
suma : integer;
i : integer;
 
begin
read(n);
suma := 0;
for i:= 0 to n do
  begin
  read(actual);
  if actual mod 2 = 0 then
    suma := suma + actual;
  end;
writeln(suma);
end.  

Python

n = int(raw_input())
nums = map(int, raw_input().split(" "))
result = reduce(lambda x, y: x + y, filter(lambda x: x %2 == 0, nums))
print result

Sobre la Enseñanza de la Informática en la Escuela

La informática que se enseña en el sistema de educación medio y secundario consiste en gran parte en la utilización de herramientas de edición de textos, hojas de cálculo, o bien en la consulta o construcción de páginas Web. Pero raramente se introduce la programación, y mucho menos las nociones de algorítmica o de estructuras de datos necesarias. La IOI y la ODI promueven precisamente el estudio de esta última faceta de la informática: la programación y su aplicacion desde la perspectiva de las ciencias computacionales.

Un colectivo sufiente de estudiantes de secundaria puede sentirse atraído por esta actividad creativa, más cuando se le proponen ayudas de trabajo adecuadas y material de iniciación. El profesorado, no necesariamente especialista en esta materia, que detecte esta habilidad o la simple curiosidad en alguno de sus alumnos, puede sencillamente acercase al movimiento ODI o inscribirlo directamente en el concurso de la ODI paraasí potenciar su interés por la informática.

Leer más:Sobre la Enseñanza de la Informática en la Escuela