Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Campeon A To
Campeon A To
El problema:
En una competicin deportiva se enfrentan n
participantes.
Debe confeccionarse un calendario para que cada
participante juegue exactamente una vez con
cada adversario.
Adems, cada participante debe jugar
exactamente un partido diario.
Supongamos, por simplificar, que n=2k.
Calendario de un campeonato
v
644
47444
8
1
2
3
4
participantes 5
6
7
8
1
2
1
4
3
6
5
8
7
2
3
4
1
2
7
8
5
6
3
4
3
2
1
8
7
6
5
4
5
8
7
6
1
4
3
2
5
6
5
8
7
2
1
4
3
6
7
6
5
8
3
2
1
4
7
8
7
6
5
4
3
2
1
Calendario de un campeonato
v
Calendario de un campeonato
v
Calendario de un campeonato
1
1 2
2 1
1
3 4
4 3
1
2
3
4
1
2
1
4
3
2
3
4
1
2
1
5 6
6 5
3
4
3
2
1
1
2
3
4
5
6
7
8
1
7 8
8 7
5
6
7
8
1
2
1
4
3
6
5
8
7
2
3
4
1
2
7
8
5
6
3
4
3
2
1
8
7
6
5
4
5
8
7
6
1
4
3
2
5
6
5
8
7
2
1
4
3
6
7
6
5
8
3
2
1
4
1
6
5
8
7
2
7
8
5
6
3
8
7
6
5
7
8
7
6
5
4
3
2
1
Calendario de un campeonato
tipo
tipo tabla=vector[1..n,1..n-1]
tabla=vector[1..n,1..n-1] de
de 1..n
1..n
algoritmo
algoritmo calendario(sal
calendario(sal t:tabla)
t:tabla)
{Devuelve
de
{Devuelve en
en tt al
al calendario
calendario
de competicin
competicin de
de
k
nn participantes,
con
n=2
,
k>0.}
k
participantes, con n=2 , k>0.}
principio
principio
formarTabla(t,1,n)
formarTabla(t,1,n)
fin
fin
algoritmo
algoritmo formarTabla(sal
formarTabla(sal t:tabla;
t:tabla;
ent
ent inf,sup:1..n)
inf,sup:1..n)
{Forma
{Forma la
la parte
parte de
de tabla
tabla correspondiente
correspondiente aa los
los
enfrentamientos
enfrentamientos de
de los
los participantes
participantes inf..sup}
inf..sup}
variable
variable medio:1..n
medio:1..n
principio
principio
si
si inf:=sup-1
inf:=sup-1
entonces
entonces t[inf,1]:=sup;
t[inf,1]:=sup; t[sup,1]:=inf
t[sup,1]:=inf
sino
sino
medio:=(inf+sup)
medio:=(inf+sup) div
div 2;
2;
formarTabla(t,inf,medio);
formarTabla(t,inf,medio);
formarTabla(t,medio+1,sup);
formarTabla(t,medio+1,sup);
completarTabla(t,inf,medio,
completarTabla(t,inf,medio,
medio,sup-1,medio+1);
medio,sup-1,medio+1);
completarTabla(t,medio+1,sup,
completarTabla(t,medio+1,sup,
medio,sup-1,inf)
medio,sup-1,inf)
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 57
Calendario de un campeonato
algoritmo
algoritmo completarTabla(ent/sal
completarTabla(ent/sal t:tabla;
t:tabla;
ent
eqInf,eqSup,
ent eqInf,eqSup,
daInf,daSup,
daInf,daSup,
eqInic:1,,n)
eqInic:1,,n)
{Rellena
{Rellena t[eqInf..eqSup,daInf..daSup]
t[eqInf..eqSup,daInf..daSup] con
con
permutaciones
cclicas
empezando
en
eqInic}
permutaciones cclicas empezando en eqInic}
principio
principio
para
para j:=daInf
j:=daInf hasta
hasta daSup
daSup hacer
hacer
t[eqInf,j]:=eqInic+j-daInf
t[eqInf,j]:=eqInic+j-daInf
fpara;
fpara;
para
para i:=eqInf+1
i:=eqInf+1 hasta
hasta eqSup
eqSup hacer
hacer
t[i,daInf]:=t[i-1,daSup];
t[i,daInf]:=t[i-1,daSup];
para
para j:=daInf+1
j:=daInf+1 hasta
hasta daSup
daSup hacer
hacer
t[i,j]:=t[i-1,j-1]
t[i,j]:=t[i-1,j-1]
fpara
fpara
fpara
fpara
fin
fin
Calendario de un campeonato
v
Coste temporal:
Recurrencia:
( )
T (n) = 2T n 2 + n 2 4
Y si n no es potencia de 2?
Supongamos que est resuelto para n par.
Si n es impar (mayor que 1), no bastan con n-1
das para la competicin, sino que se necesitan n.
Basta con resolver el problema resultante de
aadir un participante (ficticio) ms: el n+1.
Como n+1 es par, podemos calcular el
calendario, que consta de n das.
Una vez resuelto, si al participante i-simo le
toca jugar el da j-simo contra el participante
n+1 (ficticio), eso significa que j es el da de
descanso para el participante i.
Calendario de un campeonato
v
Y si n es par?
Si n div 2 es par, se puede aplicar el algoritmo
formarTabla (visto para el caso n=2k).
Si n div 2 es impar:
Paso 1:
u Se calcula la primera parte de la competicin
para los n div 2 participantes de numeracin
inferior, aadiendo un participante ficticio.
u Se calcula la primera parte de la competicin
para los otros n div 2 participantes ,
aadiendo otro participante ficticio.
Paso 2:
u El da j-simo, 1jn div 2, se hace jugar
entre s a los dos participantes, uno de
numeracin inferior y otro superior, a los
que les haba tocado el j como da de
descanso en el Paso anterior.
Paso 3:
u Se completa el resto de la tabla con
competiciones cruzadas, de forma parecida
a como se hizo en el algoritmo
completarTabla.
Calendario de un campeonato
1
2
1
2
1
3
c
1
c
3
.
.
.
1 2 3
1
2
3
c
2
1
c
3
3
c
1
2
.
.
.
1 2 3
4
5
a
d
c
3
2
1
5
4
d
a
a
d
4
5
d
a
5
4
.
.
.
1 2 3 4 5
1
2
3
4
5
a
2
1
a
5
4
3
3
5
1
a
2
4
1
2
3
4
5
6
7
8
9
10
4
3
2
1
a
5
5
a
4
3
1
2
.
.
.
1 2
a
4
5
2
3
1
6 7 8 9
7
6 10 8
8
b 6 7
9 10 b 6
10 9 7 b
b
8 9 10
10
b
9
8
6
7
b
9
10
7
8
6
1 2
2
1
8
5
4
7
6
3
10
9
4
3
2
1
10
9
8
7
6
5
5
7
4
3
1
10
2
9
8
6
6
4
5
2
3
1
9
10
7
8
8
9
10
6
7
4
5
1
2
3
9
10
6
7
8
3
4
5
1
2
10
6
7
8
9
2
3
4
5
1
7
8
9
10
6
5
1
2
3
4
3
5
1
9
2
8
10
6
4
7