Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia
Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia
Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Explicaciones a <strong>los</strong> <strong>problemas</strong> South American Regionals 2008 67<br />
Análisis <strong>de</strong>l Problema M<br />
Como nos dice la <strong>de</strong>scripción <strong>de</strong>l problema, un polígono regular es un polígono en el que todos<br />
<strong>los</strong> lados tienen el mismo tamaño y todos <strong>los</strong> ángu<strong>los</strong> interiores tienen la misma medida.<br />
Existen dos propieda<strong>de</strong>s <strong>de</strong> <strong>los</strong> polígonos regulares que nos ayudará a resolver el problema:<br />
• El perímetro <strong>de</strong>be ser un número entero.<br />
• El tamaño <strong>de</strong>l arco entre vértices consecutivos en el polígono buscado <strong>de</strong>bería ser divisor<br />
<strong>de</strong>l perímetro.<br />
Para esto <strong>de</strong>ntro <strong>de</strong> un vector <strong>de</strong> tipo booleano que es <strong>de</strong>l tamaño <strong>de</strong> todo el perímetro, lleno<br />
<strong>de</strong> true en <strong>los</strong> lugares en don<strong>de</strong> se encuentra un vértice.<br />
for(i = 0; i < N; i++) {//per: perímetro<br />
per[verLen] = true;<br />
verLen = verLen + X[i];//verLen: tama~no <strong>de</strong> cada vértice<br />
}<br />
Inicio un contador i que empieza en N, el número total <strong>de</strong> vértices, y se reduce hasta 3 que es el<br />
número mínimo <strong>de</strong> vértices <strong>de</strong> un polígono, luego veo que el número <strong>de</strong> vértices sea un divisor<br />
<strong>de</strong>l perímetro (el perímetro <strong>de</strong>be ser un número entero), inicio arcLen que es el tamaño <strong>de</strong>l<br />
arco entre dos vértices consecutivos <strong>de</strong>l polígono regular. Solo es posible tener arcLen puntos<br />
iniciales a tratar, el límite <strong>de</strong> mi segundo contador j. Para cada punto inicial, veo si hay vértices<br />
alre<strong>de</strong>dor <strong>de</strong>l círculo separados por arcLen, ésto último cumple con la condición <strong>de</strong> que todos<br />
<strong>los</strong> lados tienen el mismo tamaño.<br />
for(i = N; i >= 3; i--) {<br />
if((totPer % i) == 0) {<br />
arcLen = totPer / i;<br />
for(j = 0; j < arcLen; j++) {<br />
isPos = true;//supongo es posible construirlo<br />
k = j;<br />
while(k < totPer) {<br />
if(per[k] == false) isPos = false;//mala suposición<br />
k = k + arcLen;<br />
}<br />
if(isPos == true) //es posible contruirlo quitando i vertices<br />
}<br />
}<br />
isPos = false;//no es posible contruirlo<br />
}<br />
Una segunda alternativa más eficiente utilizando menos memoria es hallar el tamaño <strong>de</strong>l lado<br />
y el número <strong>de</strong> lados. Si sumando las distancias consecutivas po<strong>de</strong>mos construir éste numero<br />
<strong>de</strong> lados tenemos una solución. Esta solución se incluye en lenguaje c.