En los concursos de programación, ¿puedo adivinar la complejidad temporal de la solución (digamos n, n ^ 2, log n) para el problema, dado el límite de tiempo para el problema?

Es mejor que primero veas las restricciones, no el límite de tiempo. Hoy en día, en la mayoría de los casos, los autores eligen restricciones de acuerdo con la complejidad esperada de la solución. Entonces, cuando vea n = 100 , probablemente será O (n ^ 3) u O (n ^ 4) , no O (n * logn) . Por supuesto, a veces también existe la solución O (n * logn) , pero el autor decidió que n ^ 3 será lo suficientemente bueno (porque n * logn es demasiado difícil de descubrir / probar / codificar).

Y cuando tenga alguna idea sobre la complejidad esperada, el límite de tiempo le dará más pistas. Por ejemplo, la diferencia entre 1s y 3s puede decirle que se necesita descomposición sqrt en lugar de alguna solución n * logn. Pero se trata de práctica y experiencia. Debe saber qué tan rápido funciona realmente una solución, qué tan grande es la constante oculta que tiene que esperar, etc. A veces, incluso conocer el estilo del generador de problemas dado ayuda.

Pero no confíe en las restricciones todo el tiempo. Cosas como establecer n = 1000 en lugar de n = 1000000 porque de lo contrario la corrección de la solución codiciosa se vuelve obvia también sucede 🙂