¿Por qué algunas personas resuelven tantos problemas de programación pero siguen siendo aficionados?

Sus palabras sobre más de cien problemas no dicen nada acerca de su conjunto de habilidades. Puedo resolver 100 problemas fáciles en algún juez aleatorio en un solo día; por otro lado, hay un juez o dos en los que probablemente no podré resolver 100 problemas en los próximos meses.

Saber SSSP, DP, MST en realidad no tiene mucho que ver con la resolución de más de 2 problemas en las rondas CF div2. Las cosas que nombraste no son algoritmos de nivel superior, en realidad son cosas bastante básicas, y es realmente bueno que lo hayas aprendido … Pero para el tercer problema de las rondas CF div2, todo se trata de cosas aún más simples. Es por mi experiencia de hacer algunas rondas div2 más participar en rondas div1 a menudo y saber cómo luce div1A. En realidad, acabo de marcar 6 concursos pasados ​​al azar en este momento y hubo 3 problemas de implementación, 2 codiciosos y 1 DP.

Así que sigue practicando, intenta resolver div2C en el modo de práctica y debes mejorar con el tiempo. En caso de que no pueda resolver un problema, incluso si conoce el algoritmo, es una señal de que debe practicar más la resolución de problemas y aprender algoritmos solo cuando sea necesario; En caso de que vea que no sabe algo de lo que necesita para div2 C, continúe y apréndalo 🙂

100 problemas de los que estás hablando en realidad no son un gran problema para tu mejora; lo más probable es que no sea realmente un gran problema, incluso si estuvieran fuera de tu zona de confort, y 100 tareas fáciles literalmente no significan nada.

¿La práctica hace perfecto? Quién sabe … Puedes intentarlo. Sus 100 problemas resueltos no dicen mucho sobre su práctica, los perfiles con 6 años de participación constante en el concurso no significan mucha práctica también.

Digamos que alguien participa en concursos de FQ durante 6 años y tiene 150 eventos clasificados (no es un número sorprendente, especialmente para las personas div2 que tienen más eventos en los que participar, pero más que nadie en el top20 de los rankings tiene en este momento, así que probablemente es considerado como bastante consistente) . Casi todas las rondas de FQ duran 2 horas, así que digamos simplemente que su duración total fue de 150 * 2 = 300 horas . Olvidemos por un momento que hacer concursos solo puede no ser la mejor manera de practicar, y centrarnos solo en el número. Algunos concursos duran más de 2 horas; por otro lado, las personas a menudo se dan por vencidas temprano en caso de que no puedan resolver más problemas, por lo que creo que obtuvimos una aproximación decente.

Hoy en día me estoy preparando para las Finales Mundiales y dedico de 10 a 11 horas a la programación competitiva cada día. Eso nos da alrededor de 300 horas por mes , o quizás un poco más.

No sabemos mucho sobre la gente que mencionaste. ¿Tal vez no practican en absoluto excepto hacer concursos? Conozco a mucha gente que piensa que aprender cosas / captar editoriales / implementar problemas difíciles y desafiantes es aburrido y desagradable, mientras que participar en competiciones en línea es emocionante y entretenido, por lo que prefieren el segundo puesto, incluso si no significa mejorar sus resultados . En caso de que sus “concursantes experimentados” no resuelvan ningún problema y no trabajen para mejorar sus habilidades fuera de los concursos, como les acabo de mostrar, es completamente posible que más de 6 años de participar en competiciones hayan invertido en sus habilidades como Mucho tiempo que estoy invirtiendo actualmente en un solo mes. ¿Crees que uno puede convertirse en experto en algo en un solo mes?

En caso de que creas en la regla de las 10000 horas (en general, no creo que se deba tomar demasiado literalmente) : 300 horas es solo el 3% del camino para dominar la programación competitiva

Mi reacción inmediata a esta pregunta sería: ¿Cómo practicaste? ¿Resolviste problemas de dificultades muy similares? Cuando intentas problemas más difíciles, ¿con qué frecuencia intentaste resolverlos por ti mismo sin obtener ninguna pista o buscando la solución?

Creo que la práctica hace perfecto, tiene sentido; hasta cierto punto, esta es la única manera de llegar a ser grande en cualquier cosa. Sin embargo, para sacar el máximo provecho de las prácticas se requeriría alguna estrategia; Es decir, enfócate en lo que podrías aprender.

Algunas sugerencias que daría incluirían (si no lo estás haciendo ya):

  • Enfócate en las áreas que no conoces. Después de unos pocos meses, la resolución de 10 problemas fáciles (por ejemplo, el Problema A en un concurso de Divisas 2) no sería tan útil como resolver un problema de nivel medio (por ejemplo, un Problema B en un concurso de Fuerzas del Código Div-1 ).
  • Durante la práctica, trate de aprender de los errores comunes que tiende a cometer y trate de evitarlos en el futuro.
  • También durante la práctica, imagina que estás en un concurso real y trata de simular el entorno real del concurso lo más cerca posible.
  • Por ejemplo, para ACM-ICPC, nunca debe permitir que más de dos personas utilicen la máquina.
  • Para un concurso individual, creo que la función de “concurso virtual” proporcionada por Codeforces es muy útil para simular un entorno de concurso real: puedes ver tu clasificación en tiempo real y quién resolvió qué problemas y en qué momento.

Has respondido tu propia pregunta.

Sigues siendo aficionado porque estás resolviendo todos estos problemas y desafíos.

Todos estos desafíos, la programación competitiva puede ser una distracción divertida, pero apenas están relacionados con el acto de la programación.

Tu conocimiento es inútil sin aplicarlo. Sé exactamente cómo funciona un martillo, sé exactamente cómo funciona un destornillador, sé exactamente cómo funciona una sierra. Entonces seguramente podré construir una casa! No. No puedo.

Si quieres ser un buen programador, necesitas construir cosas.

* Tenga en cuenta que si solo quiere hacer desafíos y no programar profesionalmente, ignore todo lo que acabo de decir.

El truco es centrarse en la calidad en lugar de la cantidad.

En primer lugar, debe comprender que hay muchos conceptos variados en la programación que puede que no conozca. Así que para empezar debes saber lo que no sabes. Y necesitas trabajar en aprender esos conceptos.

En segundo lugar, es posible que conozca un montón de conceptos, pero no tiene práctica en ellos. Esto puede llevar a que no reconozca que un problema en particular se puede solucionar con ese método en particular o incluso si lo reconoce, es posible que no pueda resolver el mismo en el período de tiempo dado. Así que asegúrese de que tiene una práctica justa de diferentes conceptos de codificación.

En tercer lugar, lea artículos y cosas relacionadas de sitios como geeksforgeeks.org y topcoder. Quedará impresionado por los trucos que proporcionan estos artículos para simplificar su código complejo. Incluso puede encontrar soluciones simples para piezas de código que ha estado escribiendo para siempre.

Por último, supongamos que terminas haciendo dos problemas al final del concurso. Prueba la tercera pregunta después del concurso. Lea el artículo relacionado. Y no te rindas hasta que lo resuelvas! La clave es no rendirse. Finalmente, resolverás con éxito las preguntas que aún no puedes.

Enfocar tus energías nunca es suficiente. Necesitas enfocarlo en la dirección correcta.