14.01.2013 Views

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

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!