¿Cómo puede alguien mejorar sus habilidades de implementación en programación competitiva?

La práctica es la clave. Cuando practicas mucho, no solo mejorarás, sino que también descubrirás nuevas formas de mejorar las habilidades.

Pero aquí hay algunos consejos:

  • Use plantillas y macros para reducir la cantidad de escritura que tiene que hacer al implementar una solución.
  • Haga las paces con el hecho de que escribir el mejor / más rápido código no vale la pena. Solo necesitas que tu solución sea aceptada. No hay ningún punto en la optimización excesiva. En lugar de reducir el tiempo que tarda en ejecutarse el código, reduzca el tiempo que tarda en codificarlo.
  • Puedes mejorar tu velocidad resolviendo muchos problemas de paseo en un sprint. A veces, en competiciones cortas, el tiempo necesario para descubrir y resolver el problema más fácil se convierte en un factor clave para el desempate posterior.
  • Utilice una gran cantidad de funciones de la biblioteca siempre que sea posible. Te ayuda a evitar errores y mejorar la depuración. Si mantiene un repositorio de códigos útiles que a menudo reutiliza, hágalo lo más general posible y escriba sus comentarios.
  • Hay ciertos trucos de variables ambientales. Por ejemplo, muchos jueces establecen una variable ambiental ‘ONLINE_JUDGE’. Puede usar esta variable para determinar si su código se está ejecutando localmente o en un juez en línea. Entonces, si tiene muchas declaraciones de depuración, puede terminarlas en el siguiente bloque. No tiene que comentar estas declaraciones al enviar su código.

#ifndef ONLINE_JUDEE
printf (“Esta es una declaración de depuración”);
#terminara si

  • Aprenda los trucos y accesos directos del editor de IDE / texto que usa regularmente. Debe reducir la cantidad de veces que cambia de teclado a mouse. Del mismo modo, mejorar la velocidad de escritura también es útil. Sin embargo, estos dos consejos pueden no importar mucho. También puede usar nombres cortos de variables / funciones para mejorar la velocidad.
  • Uso de la derivación VCS para problemas de desafío (problemas de optimización juzgados dinámicamente). Ayuda a agregar un nuevo concepto a su solución. y quítalo cuando quieras.

El proceso de pensamiento es la clave.

  1. Aprende un idioma en su totalidad:
  1. Python, C ++ (& STL) o Java son los mejores para aprender
  1. La respuesta de Manohar Reddy Poreddy a ¿Cómo puedo aprender C y C ++?
  2. La respuesta de Manohar Reddy Poreddy a ¿Qué es el índice de aprendizaje de Java?
  3. La respuesta de Manohar Reddy Poreddy a ¿Vale la pena aprender Python? ¿Por qué o por qué no?
  • ¿Qué aprender? En la implementación / resolución de problemas:
    1. Para una vista de pájaro:
    1. Ver: la respuesta de Manohar Reddy Poreddy a ¿Qué algoritmos debo saber para convertirme en un buen programador?
  • ¿Cómo aprender? En la implementación / resolución de problemas:
    1. Ver: la respuesta de Manohar Reddy Poreddy a ¿Son buenos los tutoriales de la Academia Khan sobre Algoritmos o hay algún tutorial mejor?
    2. Ver: Top 10 algoritmos y estructuras de datos para la programación competitiva – GeeksforGeeks
    1. La mayoría de los geeks para los geeks no tienen una explicación suficiente, pero tiene un buen ancho en todo lo que se puede aprender.
  • El proceso de pensamiento es la clave.
    1. Resuelve ‘todos’ los problemas fáciles primero
    2. Tome notas de consejos y trucos de soluciones fáciles, qué funcionó y qué no funcionó
    1. Aplíquelos al resolver problemas más difíciles (moderados, duros, avanzados).
  • Aprenda avanzado, específico para el subdominio de la pregunta, gradualmente:
    1. Estructuras de datos avanzadas
    2. Algoritmos avanzados
  • Piense más allá de la solución ingenua, a una solución óptima.
    1. Tómese más tiempo para problemas difíciles que fáciles
    2. Esto nos ahorrará muchos días de pena después.
  • Usar papel / pizarra
    1. Borrar una idea no óptima es fácil y más rápido, en comparación con escribir en código.
    2. Esto ahorrará mucho tiempo.
  • Con el tiempo, entenderemos mejor las complejidades.
    1. Obtenemos múltiples soluciones para un solo problema, algunas ingenuas, algunas óptimas, otras subóptimas, a medida que avanzamos.
    2. También debemos avanzar en la comprensión de la complejidad de todas nuestras ideas / soluciones.
    3. Esto ahorrará mucho tiempo en lugar de realizar pruebas y errores con soluciones ingenuas y subóptimas.
  • Por último, no renunciar a una solución por completo.
    1. Vuelve a ello más tarde.
    2. Entonces, muchos problemas iniciales no resueltos serán más simples.

    Hazte un screencast durante un concurso (5 hrs, digamos) y trata de observar cómo lo hiciste en base a estas dos etapas (como prefiero llamarlas).

    Etapa 1: pensar, es decir, el tiempo que invirtió para venir con un algoritmo y no usó su máquina a excepción del problema de lectura. Después de esto, el temporizador para la segunda etapa comienza y termina cuando se acepta.

    Etapa 2: uso de la máquina, específica a la que:

    • ¿Cuántas líneas de código escribiste, en general? ¿Qué porcentaje de estos estaban presentes en la solución final aceptada, es decir, contar cuántas líneas de código ni siquiera se requirieron (como sentencias de depuración, o si escribió algo que se dio cuenta de que no va a necesitar, o si encontró una mejor manera)?
    • ¿Qué porcentaje de este tiempo le llevó escribir una solución completa y luego cuánto tiempo le llevó corregirlo, es decir, cuánto depuró?
    • ¿Qué porcentaje de su tiempo se destinó a cambiar de ventana, escribir bibliotecas incluidas, copiar entradas de pegado, etc.?
    • ¿Qué porcentaje de este tiempo no estabas haciendo nada con la máquina? ¿Qué estabas haciendo realmente? ¿Se dio cuenta de que su algoritmo es ineficiente, o simplemente estaba trabajando en algunos detalles más finos de su implementación, que no había pensado antes?
    • ¿Qué tan rápido estaba escribiendo? ¿Estuvo limitada esta velocidad por la velocidad de escritura o porque no pudo pensar rápidamente qué escribir?

    Cuando haga este ejercicio, se dará cuenta de dónde se está desperdiciando la mayor parte de su tiempo durante la implementación. Descubrirá que nunca se trata de escribir, usar macros, usar plantillas, trucos IDE, cambiar de ventana rápidamente, etc. Perdió el tiempo porque no tenía la previsión, no pensó en las cosas antes de escribir su código. Escribir códigos es como escribir prosa. Usted está tratando de contar su historia a una persona muy tonta, la computadora, en su lenguaje. Lo primero que hace un buen escritor de historias antes de entrar en la escritura real es: él / ella lo piensa bien; él / ella sabe cómo comienza y cómo termina, cómo y cuándo se introduce un nuevo personaje y así sucesivamente.

    Ahora, no pensaste qué funciones escribirás, cómo se estructurará el código; Estabas pensando en la historia solo 2 o 3 líneas adelante. Y ahí fue cuando las cosas se volvieron locas. Usted escribió sus tres líneas, vio que realmente no encajaba en la historia, las eliminó y trató de comenzar de nuevo. Te pusiste un poco enojado y frustrado después de algunas repeticiones del mismo ciclo (a quién no le gustaría), perdiste el enfoque y en la siguiente línea que escribiste, escribiste un [math] i [/ math], en lugar de un [ matemáticas] j [/ matemáticas]. Más tarde, se divirtió mucho al depurar eso, al escribir varias declaraciones de impresión y ejecuciones secas, solo para encontrar este minuto de error.

    Entonces, la lección aquí es que antes de ir a su máquina, use un lápiz de papel para hacer un borrador de cómo se verá su código final. Puede pasar más tiempo pensando cómo se pueden simplificar más las cosas, de modo que haya menos posibilidades de crear errores. La creación de una clase ayuda, oh sí ; ¡hazlo entonces! “Maldición, esta función se está volviendo demasiado grande, dividámosla en subtareas”. “Mierda, el trabajo de esta función parece aterrador, necesito tener mucho cuidado al implementar, así que voy a escribir todo en papel”. “Oh, espera, asumí que esta función específica se puede implementar en [math] O (n) [/ math], pero ahora me doy cuenta de que es [math] O (n ^ 2) [/ math], este algoritmo es un completo desperdicio . No importa, ahorré un tiempo precioso evitando escribir 100 líneas de código y luego darme cuenta ”.

    Ok, ya ha terminado con su historia, emocionado de compilar y ejecutar la entrada de muestra, pero espere, ¿por qué no leemos una lectura primero? Vamos a disfrutar de toda la gloria del mundo leyendo el código más hermoso y hermoso que se haya escrito para ese problema. ¿Quién dijo que los códigos asombrosos deberían funcionar correctamente? ¿Derecha? Mal (duh). Usted lee la basura que ha escrito y se asegura de que al menos la cosa funcione correctamente, ¡hermosa o no! Encontrará algunos errores tipográficos aquí y allá, le ahorrará tiempo y mantendrá su calma al evitar leer los errores de compilación de esas 1000 líneas (solo porque se perdió un punto y coma), y se asegurará de que al menos se ve bien

    Ha terminado con la implementación, si obtiene respuestas, bien, ha terminado con la mayoría del trabajo. De lo contrario, luego pasa a múltiples etapas de depuración, ¡lo cual es historia para otro día!

    Sólo hay una manera – “Práctica”.

    Practique resolver muchos problemas en uno de los sitios competitivos, hasta que deje de cometer errores, más fácil decirlo que hacerlo.

    1. Mantenga un objetivo / como objetivo: resuelva 100, luego revise o improvise sobre temas tratados.
    2. Resuelve otros 100 – revisa y vuelve a revisar los conceptos

    Repita los pasos 1 y 2 hasta que se convierta en un objetivo con calificación roja en uno o dos de los sitios de programación más competitivos. En general, he observado que se tarda entre 2 y 3 años en llegar a un estudiante promedio con una pasión inquebrantable.