Concurso de Mictlan: TJU Contest #10
Publico mis soluciones a los problemas del pasado concursito en el sitio de la Universidad Tecnológica de la Mixteca - Mictlan: TJU Contest #10, en el orden en que los resolví. En general me gustó el torneo, los problemas estuvieron variados y bien escogidos. Lástima que al final se cayó el servidor y no pude terminar el problema que me quedó faltando.
- El primer problema que resolví fue el 2772 - Parallelogram. Consiste en determinar si 4 puntos dados podrían ser las esquinas de un paralelogramo. Utilicé la ecuación canónica
de una recta para resolverlo.
Este es el código: 2772.cpp - Después hice 2189 - The key stations: Hallar los puntos de articulación de un grafo no dirigido. Hay un problema casi idéntico en el sitio de la Universidad de Valladolid. Ya lo había hecho, así que conocía el algoritmo y reciclé código. El algoritmo está en el libro “Introduction to Algorithms” de Thomas Cormen y otros.
No me gustó el formato de entrada de este problema. Me dio Accepted al segundo intento, por un estúpido Presentation Error.
Este es el código: 2189.cpp - 2028 - Excuses, excuses!. Un problema ad-hoc de strings. Utilicé un mapa para el diccionario y un stringstream para dividir una frase en palabras.
Otro Presentation error más estúpido todavía me dio otros 20 minutos de penalización.
El código: 2028.cpp - Finalmente resolví 1058 - Lifting the stones. Para mi gusto el mejor problema del set. Se resume así: Dado un polígono simple (es decir, que no se intersecta a sí mismo) que representa una lámina de densidad superficial constante, encontrar las coordenadas del centro de masa de la lámina.
Resolví este problema aplicando el Teorema de Green, que relaciona la integral doble de una región con la integral de línea de la curva que la encierra. En otras palabras:
donde
es un campo vectorial de la forma
.
Ahora bien, la coordenada
centro de masa de una lámina plana está dada por:
donde
es la función de densidad (en este problema una constante que podemos considerar
) y
es la masa neta de la lámina.
Similarmente, la coordenada
es:
.
La parte crítica del problema es ver que las integrales dobles que aparecen en los denominadores se pueden expresar como una integral de línea, y esta se puede evaluar conociendo los puntos del polígono porque un polígono simple es una curva cerrada suave a trozos donde cada trozo es una recta.
Sea
un campo vectorial con la forma
Derivando parcialmente obtenemos que:
Que es justamente la función que queremos integrar.
Aplicando el Teorema de Green llegamos a que:
pero como el polígono es una curva suave a trozos podemos expresar esta última integral como la suma de una integral por tramo:
Ahora sólo hace falta parametrizar la curva
para evaluar esta integral de línea.
Dado quees una recta que va de los puntos
a
la parametrizamos con la función vectorial
donde el parámetro
La primera coordenada de esta función es lo que hemos llamado
y la segunda es lo que hemos llamado
, y
es la pendiente de la recta
. Derivando estás funciones vemos que
y
.
Entonces nuestra integral de línea en cuestión queda
Una integral fácil de evaluar cuyo resultado es
Teniendo en cuenta que
y aplicando un poco de álgebra, vamos a llegar por fin a la solución:
Para la coordenada
es un proceso casi idéntico, pero me da mucha pereza escribirlo acá.
La respuesta es:Sólo faltan dos detalles para poder codificar una solución aceptada por el juez: Para efectos de este problema, la masa es directamente proporcional al área del polígono. El área se encuentra con el algoritmo explicado en el libro Programming Challenges de Miguel Revilla. El otro detalle es que el teorema de Green nos exige que la curva cerrada esté orientada en sentido antihorario, así que si el polígono original está en sentido horario hay que reversarlo antes de correrle este algoritmo.
Tengo que decir que gran parte de esto salió de la cabezota de Arcila.
De cualquier modo, aquí está el código: 1058.cpp
Ahh por cierto, pudieron ahorrarse el trabajo de leer toda esta vomitadera matemática leyendo esto (Tal vez debí poner este anuncio arriba).
Nota del autor: Buah, acabo de leer todo lo anterior y me parece sumamente aburrido. Necesito bailar un rato.
Comments(3)

