¿Cómo debo practicar para estar en un nivel en el que pueda abordar los problemas Div1-500 de TopCoder con confianza? Soy un novato con cero experiencia en programación competitiva.

La impaciencia es un vicio, joven Jedi. Vamos a ir despacio, ¿vale?

  • Primero, aprende a escribir un programa de hello world. Esta es la parte más fácil.
  • Luego comience a resolver problemas de nivel fácil div2 (250 puntos por lo general). Solo prueban si puedes traducir la más simple de las ideas en código o no. A menos que pueda resolver cualquier problema de este tipo en puntaje> = 240 en un día cualquiera, simplemente no puede traducir sus ideas en código. Sigue practicando.
  • Ahora sabes codificar un poco. Es hora de aprender algunos algoritmos. Lee los tutoriales de Topcoder, son un recurso excelente, resuelve todos los problemas vinculados. Lee los foros de topcoder y acostúmbrate al ecosistema. Estudia algunas técnicas de algoritmos básicos como la Programación Dinámica y divide y vencerás. Estudie Teoría de gráficos, algo de Combinatoria y algo de Teoría de números, todo esto mientras resuelve problemas en Topcoder y en otros lugares. Puedes encontrar todo el conocimiento en internet fácilmente.
  • Si ha llegado a esta etapa, sabe cómo escribir código y sabe lo suficiente de la teoría básica de algoritmos. Los problemas de Topcoder div1-500 a menudo son muy difíciles, antes de que empieces a resolverlos, deberías poder resolver los problemas de 250 div2, 500, 1000 y div1 de 250 puntos.
  • Asegúrate de codificar todo. Resolver un problema teóricamente es agradable y bueno, pero no se detenga ahí, codifíquelo y asegúrese de que pase la prueba del sistema.
  • Una vez que lo haga, elimine todo el código y comience desde cero. Vuelva a escribir todo el código. Hazlo bien en el primer intento. Mira cuánto mejora tu tiempo.
  • Empieza a leer los códigos de los mejores jugadores, lo que básicamente significa todos los rojos, objetivos y varios amarillos también. Estos chicos son inteligentes y hay mucho que puedes aprender de su código.
  • Ir a través de la editorial de cada problema que resuelva (o no puede resolver). A menudo vienen con grandes ideas y soluciones alternativas, etc.
  • No te acostumbres a resolver problemas fáciles. Es un error común. Siempre resuelva los problemas más difíciles de lo que puede resolver; así es como aprende.

Y cuando has estado haciendo todo esto por un tiempo, estás listo. Pronto descubrirás que estás resolviendo más y más problemas de puntero div1-500. La práctica es la clave de ahora en adelante.

Lo que hicimos nosotros (mi equipo de ICPC) en particular fue: mantener una hoja de cálculo de nuestro registro de práctica de Topcoder. Decidimos hacer div1-500 punteros de todos los partidos de 300 en adelante. Así que una vez que comiences un partido, asegúrate de terminar su problema, incluso si tienes que ver el editorial después de luchar durante horas. Sé persistente y no te rindas.

Cuánto tiempo demora antes de alcanzar su objetivo y cuánto tiempo debe dedicar, estas son preguntas altamente subjetivas sin una respuesta definitiva. Todo varía en su velocidad y capacidad de comprensión. Sé que suena cliché, pero créeme, esta es la única respuesta correcta.

¡Buena suerte joven Jedi, que la fuerza te acompañe!

PD: También podría estar interesado en la respuesta de Pradeep George Mathias a ¿Qué se necesita para convertirse en un buen algoritmo como los mejores clasificados en Topcoder / Spoj / GCJ?

Obtener una alta calificación en las competiciones TopCoder / Codeforces no es un éxito de la noche a la mañana. Lleva mucho tiempo y esfuerzo y no hay atajos (que yo sepa). Pero lo bueno es que es muy divertido (en serio, cuando te mejores, es mucho más divertido que los juegos de computadora) y cualquiera puede hacer esto .

Desde mi experiencia personal (soy Mimino, tanto en TopCoder como en Codeforces), recomendaría lo siguiente:

  • Elija un lenguaje de programación que vaya a utilizar en todas las competiciones. Yo diría que la mejor opción es C ++, debido a su velocidad, las estructuras de datos / algoritmos disponibles en la biblioteca STL y porque todas las competiciones lo admiten. Otras opciones razonables son C # o Java o tal vez Pascal. Pero Pascal no es compatible con TopCoder y C # no es compatible con ACM ICPC. Además de estos idiomas no recomendaría ningún otro. Ahora, cuando elige un idioma, apréndalo y con su biblioteca estándar. Pensar en la sintaxis del lenguaje definitivamente no es algo que quieras hacer durante la competencia.
  • Elige un IDE y quédate con él. Si está disponible, aprende a usar su depurador. Aunque es bueno aprender a depurar sin el depurador integrado, a través de los mensajes de salida bien ubicados.
  • Obtener algunos conocimientos teóricos de algoritmos. El libro “Introducción a los algoritmos”, escrito por Cormen y algunos otros chicos, se considera Biblia sobre este tema. Contiene casi todos los algoritmos, matemáticas y estructuras de datos que necesita saber para las competencias de programación.
  • Resuelva los problemas en USACO – http://train.usaco.org/usacogate . Este portal prepara a los estudiantes de secundaria de EE. UU. Para la Olimpiada Internacional en Informática. Contiene una gran cantidad de tutoriales y problemas específicos del tema en dificultad que aumenta lentamente. En serio, es un gran lugar para empezar. Un pequeño consejo – en serio, termina todos los problemas allí. No renuncies solo porque te quedaste atascado en algún problema. Estas son las cosas que te hacen mejor. Pero si te atascas seriamente, consulta / pregunta en los foros de TopCoder para obtener la respuesta.
  • Si tiene un problema con la implementación de una solución para un problema, entonces practique, practique, practique. No importa en qué juez en línea elija practicar (TopCoder, Codeforces, CodeChef, SPOJ, Timus, etc.), escriba una gran cantidad de código. Debido a que el código fuente típico de la competencia tiene ~ 100 líneas de código, no estamos hablando aquí sobre el arte del diseño de software. Desde mi punto de vista, alrededor del 80-90% del código que escribo durante la competencia, ni siquiera lo pienso. Se siente como si mis manos supieran qué escribir. No tengo que pensar en los nombres de las variables que uso, porque según su propósito, siempre les pongo el mismo nombre. No pienso en cómo representar una gráfica, recorrer la gráfica, multiplicar matrices, etc., porque he escrito estas cosas muchas veces antes y siempre las escribo de la misma manera. Esto te da la ventaja de la velocidad y también te libera de las cosas de bajo nivel, para que puedas pensar en los problemas más importantes. Para obtener un estilo de codificación agradable, recomendaría leer las soluciones de SnapDragon en TopCoder. Incluso un codificador de alta calificación puede aprender algo de él.
  • Si tiene un problema para encontrar una solución para un problema, entonces dependiendo de su nivel de habilidad, realice una de las siguientes acciones
  • Si eres un principiante e incluso los problemas más fáciles te hacen pasar un mal rato, entonces necesitas aprender cómo funciona la resolución de problemas. En mis primeros días acabo de leer las toneladas de problemas y sus soluciones de muestra sin implementarlos . Si los hubiera implementado, llevaría mucho tiempo. Lo que obtuve de esta estrategia fue el “pensamiento de resolución de problemas”, es decir, si veo un laberinto en el problema, es un gráfico, si estoy buscando una solución óptima de algún tipo, generalmente es la programación dinámica, si es un problema. El juego se juega, es un nim. En otras palabras, comenzarás a ver los patrones.
  • Si conoce los conceptos básicos de la resolución de problemas, resuelva los problemas implementándolos. Siempre trata de elegir los problemas un poco más difíciles de lo que te sientes cómodo. Si no sabe cómo resolverlo, lea la solución, intente entenderlo y luego implementarlo. Es tan simple como eso
  • El último paso es – hacer las competiciones! Una cosa es resolver el problema, cuando tiene todo el tiempo que necesita. Algo diferente es resolverlo dentro del límite de tiempo dado, con toda la prisa, cuando veas que otras personas ya lo están enviando. Si suena aterrador, bueno, podría ser 🙂 ¡Pero es lo mejor que nunca! Lo mantendrá motivado, podrá ver su progreso y convertirse en parte de la comunidad.

Y eso es todo. Espero que mi respuesta le ayude en su viaje de programación y no dude en preguntar, si tiene alguna pregunta.

Lo encontré en algún lugar de Quora solamente. ¿Cómo debería uno idealmente comenzar?

  1. Lee el problema hasta que lo entiendas correctamente . Intenta resolverlo por ti mismo. Dar por lo menos una hora para esto.
  2. Averigüe las diferentes formas en que pueden ser posibles y sus complejidades y si cumplirán con las restricciones dadas.
  3. Si aún no puede resolver esto, revise las etiquetas asociadas con el problema [si existe]. Aprenda si alguna etiqueta desconocida es suya, puede obtener la pista. Una vez que haya revisado las etiquetas, existe la posibilidad de que pueda resolver el problema.
  4. Si esto no funciona, verifique la editorial del problema . Ahora es probable que pueda resolver el problema en la mayoría de los casos.
  5. Trate de codificar la solución según editorial.
  6. Ahora, incluso si ha resuelto el problema correctamente o aún no ha resuelto, verifique la solución Testers and Setters . Compruebe las soluciones de algunos buenos programadores y aprenda cosas nuevas de ello.
  7. Si aún no ha resuelto el problema, resuélvalo ahora y consígalo Aceptado .

Intente resolver todos los problemas con este enfoque, y usted mejorará de la manera más rápida posible.

[EDITAR:]
La respuesta de Bhavesh Munot a ¿Está bien tomar referencia de otras soluciones al resolver una programación competitiva para un principiante?

Timothy Ferris puede estar en desacuerdo, pero la mayoría de los expertos creen que la regla de las 10.000 horas tiene sentido: convertirse en un experto en algo requiere 10.000 horas de práctica: 3 horas al día, todos los días, durante 10 años.

Uno de los problemas no resueltos y no diagnosticados de nuestro tiempo (IMHO), un problema que afecta específicamente a los inteligentes y ambiciosos, es que ahora hay tantas cosas que hacer con un cerebro que nadie puede estar involucrado en nada que no sea la fracción más pequeña de ellos. Lo que significa que uno tiene que tomar decisiones desde el principio, y durante la vida.

Entonces, ¿cuál es tu objetivo aquí? ¿El objetivo es convertirse en programador, como trabajo y hacer un buen trabajo, pero también tener una vida personal y tiempo para aprender sobre todo lo demás en el mundo: historia, biología, tecnología no informática, etc.? Si es así, sé realista: no podrás aprender todo el trasfondo, ganar toda la experiencia, que te permite competir con los mejores programadores del mundo. No esperaría ser capaz de completar una carrera de 100K si fuera un corredor amateur que ocasionalmente corre una milla.

No hay vergüenza en esto. Cuando era más joven, tenía ambiciones de aprender todo. Pero a medida que el tiempo pasó, tuve que conformarme con estudiar un campo de manera intensiva y solo adquirir un conocimiento superficial de otros campos. Puede ser un ciudadano útil con una vida plena al convertirse en un buen programador en algún campo (no sé: códecs, redes, numéricos, compiladores, lo que sea) sin la amplitud extrema de experiencia y la obsesión con una determinada forma de programación. , que caracteriza la resolución de este tipo de problemas.

Alternativamente, si está determinado a ascender a la cima, no solo va a ser un programador comercial, va a ser un programador de marca – bueno, ¿puede y está dispuesto a poner en 10,000 horas, y para sacrificar su interés en la mayoría de los otros temas?

Puedes ser feliz de cualquier manera. Pero es poco probable que seas feliz si te imaginas en un campo, mientras que en realidad vives una vida en el otro campo.

La programación competitiva requiere tanto habilidad para resolver problemas (aplicación) como conocimiento de algoritmos.
Descargo de responsabilidad: Se requiere mucha paciencia para hacerlo. Y al menos un año para un cerebro por encima de la media.
[lo que deberías / yo hago]
1. Comenzar con el aprendizaje e implementación de nuevos algoritmos. Use cualquier buen libro que desee (puede ser CLRS) y varios tutoriales en topcoder. Practicar un poco en OJs ayudará.
2. Luego intenta resolver el div 1 500 en la sala de práctica. Si puede resolverlos, entonces está bien, de lo contrario, intente seguir el editorial. Ahora, si entiendes el editorial (sin muchos problemas) que significa que tienes el conocimiento algorítmico, solo necesitas practicar más para mejorar tu habilidad para resolver problemas. Así que practica para adquirir esa habilidad. Y si no entiende el editorial fácilmente, primero necesita aprender esos algoritmos (los algoritmos utilizados generalmente se mencionan allí). Y a medida que practique más y más, podrá adivinar el tipo de problema cada vez más rápido y no tiene límite.
(Y luego llegará al estado de turista o Petr cuando su único cuello de botella sea su velocidad de escritura. 😛)
[el número por cierto de horas que necesita depende de qué tan rápido desea alcanzar su meta y qué tan rápido puede aprender]

Esto va a ser un poco largo, pero ten paciencia.

(Teniendo en cuenta que está familiarizado con topcoder, codeforces, codechef y spoj)

1> Primero, practique las preguntas de nivel A y nivel B en las fuerzas de código, de manera que haya escrito al menos 10000 líneas de códigos. (Puede tomar 4-6 meses)

– Beneficio: con esto me refiero a una variedad de códigos, incluso si no puede resolver problemas basados ​​en algoritmos estándar, sabrá qué necesita aprender y cuál es la profundidad de la codificación competitiva. Porque a menos que llegues a saber qué estudiar, ¿cómo puedes estudiarlos?

2> Luego se pasa a los tutoriales de algoritmo de codificador superior, los estudia, no es necesario profundizar, solo alcanza el nivel intermedio. Resuelva los problemas relacionados que se publican allí. Los temas que se estudiarán allí dependerán de su interés y de los conocimientos adquiridos hasta el momento. (El tiempo tomado depende de su interés)

–Beneficio: llegará a conocer los algoritmos estándar, comenzará a reducir los problemas a algoritmos simples y los resolverá de manera efectiva. Una vez que haya completado el tutorial, se le presentará una mayor profundidad de la codificación. Bien por usted.

3> Después de practicar los problemas de muestra en topcoder en el tutorial (No, no debe participar allí en SRM ni resolver más problemas, todavía no está listo), salte a spoj. El mejor para aprender y practicar algoritmos. Practique al menos 300 problemas antes de participar en los SRM en topcoder (Practicar 300 problemas le dará suficiente combustible para volverse azul o amarillo allí en SRM, y eso también es demasiado pronto, sin embargo, si está interesado en un progreso constante, puede participar allí. ) (Puede tomar por lo menos 8-10 meses).

– Beneficio: Basta de práctica en spoj le permitirá pensar soluciones de problemas moderadamente difíciles en minutos, un requisito previo para volverse azul o amarillo tan pronto como sea posible. Y mi amigo, te sentirás realmente bien después de resolver 300 problemas en spoj. Solo tenga en cuenta que usted los resuelve disminuyendo el orden de los usuarios que los resolvieron. No saltes a nuevas preguntas en codicia por puntos, te arrepentirás.

4> Ahora, adivinando que aún no ha participado en los SRM de codificador superior, comience a aumentar su nivel de precisión y velocidad participando en concursos cortos en las fuerzas de código (una vez que esté satisfecho con su salto de rendimiento a los SRM de codificador superior). podría tomar 6-8 meses)

–Benefit: Felicitaciones, ahora usted es un programador experimentado y puede calificar para los regionales de ACM ICPC con más práctica. Volverse rojo será un gran logro.

LO MÁS IMPORTANTE DE TODOS: ” MANTENGA SU TERCERA Y LA ADICCIÓN VIVA

Espero eso ayude !!

Un truco básico y simple que me funcionó en un momento fue:
1. Crea una hoja de cálculo de problemas de práctica disponibles.
2. Pruebe un problema aleatorio fácil y registre el resultado en la hoja (éxito / fracaso)
Si tienes éxito:
intente más problemas y si tiene éxito el 50-80% del tiempo en el mismo nivel, suba la dificultad del problema (aproximadamente, div1-250 = div2-500, div1-500 = div2-1000)
si fallas:
lea la solución (explicación si está disponible, pase el código de otra manera) e intente el mismo problema después de un tiempo (de modo que olvide la solución, pero recuerde el principio)
3. enjuague y repita

Más lo que sugieren otras respuestas.

Para mí, el mejor recurso fue el libro Desafíos de programación de Steven Skiena ( http://www.amazon.com/Programmin …). Un curso de matemáticas discretas ayuda. Concrete Math by Knuth es uno de mis favoritos ( http://www.amazon.com/Concrete-M …).

Personalmente, creo que la mejor manera de aprender programación es comenzar a escribir el tipo de código que desea escribir, ya sea videojuegos, servicios web, software de utilidad, piratería de hardware, resolución de problemas oscuros en un sitio web competitivo o lo que sea. Si estás interesado en el tema, tu cerebro estará vivo, despierto y con ganas de aprender. Si está convencido de que está haciendo tareas para obtener ganancias futuras, su cerebro tomará su palabra y lanzará todo lo que esté presionando para aprender en la papelera.

Una vez que haya establecido un camino en el que esté realmente interesado en su desarrollo, se acelerará en gran medida y, si tiene una verdadera pasión por él, podría agotar sus 10,000 horas bastante pronto. También se encontrará expandiendo sus horizontes para comprender mejor o implementar algunos matices o tangentes a su interés central.

TL; DR: no hagas las cosas que crees que debes hacer para mejorar tus habilidades, pero en las que no estás realmente interesado. El ROI es extremadamente bajo.

Estoy de acuerdo con el Sr. Garg. Pero también creo que sería útil practicar en HackerRank porque tiene categorías y complejidad (fácil y medio). Es más complejo que el codificador superior y también tiene competiciones. Después de practicar cada categoría en hackerrank (resolver problemas de nivel medio), ¡creo que resolverías la división de TC! 500 problemas con la confianza.

hackerrank también es útil para los principiantes porque ha creado algunas categorías como cadenas, geometría de programación dinámica … para que no tenga que perder tiempo para elegir el algoritmo correcto
Y también puedes tener los casos de prueba de tus problemas.

También soy uno de los novatos. Pero mi estrategia ahora es que estoy recopilando tanta información para los algoritmos y el contenido relacionado con ellos. En segundo lugar, cómo otros están trabajando o han mejorado.

Otro paso lo he tomado en lugar de utilizar un sitio web que rompe el entusiasmo como topcoder o spoj. En este momento me he centrado en codecheff, techviewview, careercup, codeforce, Project Euler. Lo encontré poco viable.

Por último, creo que es importante no tener pánico sobre “No sé o no estoy entendiendo la lógica”. Es bastante obvio. Por lo tanto, concéntrese en lo que puede hacer y en serio, después de un tiempo, otros lo seguirán, no será un seguidor.

La práctica es la única clave para el éxito en los algoritmos. Hay muchos sitios web buenos disponibles para la práctica en línea. Considero que este Algolint es muy atractivo. Es la herramienta más sencilla para practicar la codificación. También puede guardar su código como plantilla para poder tener Código base listo todo el tiempo cuando intenta un problema similar.

Comience con http://teamtreehouse.com y http://codecademy.com . Te llevarán un poco más lejos (Hello World). A partir de ahí, obtenga un trabajo de codificación de nivel de entrada para construir su experiencia haciendo algo.

Leer leer leer. Ya sea en línea o en un libro real (¿quién hace este último?). Horas extras, una vez que permanezcas apasionado y enfocado, llegarás 🙂

La programación de aprendizaje de Peter Norvig en 10 años parece aplicable:
http://norvig.com/21-days.html