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