ideas para resolver los problemas :) · se puede simular (en compu o en papel) los primeros...

20
Ideas para resolver los Problemas :)

Upload: others

Post on 13-Sep-2020

3 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Ideas para resolver los Problemas :)

Page 2: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Quienes somos?

Problemsetters TAP 2018UNR - Mariano Crosetti, Pablo ZimmermannUNC - Matias Hunicken, Franco MarinoUBA - Leopoldo Taravilse, Federico Pousa, Ariel Zylber, Pablo BlancUNLP - Nicolas MazzocattoUNSur - Nicolás Alvarez

Page 3: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema A: A guardar● El problema nos pide la menor cantidad de movimientos para llegar desde

una situación a otra.● Este tipo de problemas suele resolverse representando el sistema como un

grafo, donde los nodos son los estados del sistema y las aristas las transformaciones que podemos realizar con un movimiento.

● Para obtener la rta., podemos encontrar una distancia mínima en ese grafo con BFS. La mayor dificultad del problema es cómo armar ese grafo.

● Una posibilidad es que los nodos del grafo sean ternas (i,j,k), donde○ (i,j) es la posición de la caja en la grilla (si la caja está acostada, elegimos una en particular,

por ejemplo la de la izquierda si está horizontal, la de arriba si está vertical).○ k puede tomar 3 valores y representa la orientación de la caja (si está parada, si está

acostada horizontalmente, o si está acostada verticalmente).

Page 4: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema B: Buenos Amigos● Queremos minimizar la cantidad de amigos que Leo molesta dadas unas

reglas algo raras● Si los libros estan a D y mandamos a un amigo que camina L luego quedaran

a D = D - (L-D) = 2D - L (D<=L<=2D).● Si mandamos un amigo que camina L1 y luego uno que camina L2 quedaran

a D = 4D - 2L1 - L2. Luego conviene mandar primero a los que caminan mas● Si mandamos N personas que caminan D es facil probar por induccion que

luego nos queda una distancia de 2^N D - (2^N - 1) L. Luego la distancia decrece exponencialmente (asumiendo que decrece o sea D<L).

● De lo anterior podemos simularlo enviando los amigos (que caminan mas) y luego los companieros. Hay que tener cuidado si D>=L parar la simulacion.

Page 5: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema C: Complicando contraseñas● Se puede simular (en compu o en papel) los primeros dígitos de la

contraseña de Laino.● Al hacerlo vemos que es: 462483261224832● Notar que el patrón 24832612 se repite indefinidamente a partir del 3er dígito

Por lo tanto:

● Si N = 1: 4● Si N = 2: 6● Si N tiene resto 3 al dividirlo por 8: 2● Si N tiene resto 4 al dividirlo por 8: 4● …..

Page 6: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema D: Descenso (Solución 1)● El problema se reduce a hacer un bucle for y probar para cada puntaje, si con

ese puntaje se aseguro no descender o no.● Para eso, se puede demostrar, que podés suponer que todos los que están

arriba empatan entre ellos, y empatan/pierden con vos.● Y que conviene poner M-1 abajo que pierdan todos (no importa entre ellos

como salen)● Si podés armar esa distribuición es que con ese puntaje no te podés

asegurar ganar. O sea, es una formula para cada puntaje.● Ver si podés armar distribución la ves haciendo una cuentita (ves si el puntaje

de los que pierden con vos te supera o no)

También se puede calcular con una formula en tiempo constante, abajo se explica la otra solución, en la diapo que sigue está explicado:

Page 7: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema D: Descenso (Solución 2)● P = (floor((N*(N-1)-(M-1)*(M-2))/(N-M+1))+1)/2● Puntos totales (PT) son (N*(N-1))/2● PTNM1 son los puntos totales que pueden hacer los N-M+1 primeros equipos

como máximo PTNM1 = PT-(M-1)*(M-2)/2. P1 son mis puntos● si P1*(N-M+1)>PTNM1, entonces seguro no desciendo. Básicamente si

tengo menos de M estrictamente abajo y yo tengo P1 puntos, entonces hay al menos N-M+1 equipos que tienen P1 puntos.

● P1*(N-M+1)<=PTNM1, entonces puedo descender porque agarro los N-M+1 equipos y les pongo puntaje P1, a los M-1 de abajo les pongo M-2 puntos a cada uno y los puntos que faltan se los puedo poner seguro a algunos de los N-M+1 y "despegarse" de mi pero eso no cambia, no puedo asegurar que tengo M abajo.

● Con otra justificación, se puede ver que (N+M-1)/2 también funciona.

Page 8: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema E: Estacionamiento ● Se puede resolver con programación dinámica. Una posible recurrencia es:● f(s,e,b) con -M <= s <= e<= M, b en {0,1}, que representa: “esperanza de la

cantidad de pasos que realizo para encontrar el auto desde este momento dado que ya visité las cuadras en [s,e] y que estoy parado en s si b=0 o en e si b=1”.

● El caso base es f(s,e,b) = 0 si la suma de la probabilidad entre s y e es 1.● La respuesta es f(0,0,0) (no visitamos ninguna cuadra).● Para el caso recursivo, veamos el f(s,e,0).

Page 9: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema E: Estacionamiento (cont.) ● Veamos cómo resolver f(s,e,0).● Si el auto está en s, hacemos 0 pasos. Si no está, debemos elegir lo óptimo

entre movernos a s-1 con costo 1 o movernos a e+1 con costo e-s+1.● La probabilidad de encontrar el auto en s dado que no está en [s+1,e] es

p[s]/(1-Q+p[s]) , donde Q es la suma de la probabilidad en [s,e].● Entonces, f(s,e,0) = (p[s]/(1-Q+p[s])) * min(1 + f(s-1,e,0), e-s+1 + f(s,e+1,1))●● El caso f(s,e,1) es muy parecido.

Page 10: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema F: Fusión de EmpresasVamos a ver una lista de propiedades, las primeras dos son fáciles de ver:

● Si todas las empresas son iguales, solo puede quedar esa al final (RTA: 1)● Sino, si tenes al menos una empresa de cada producto, nunca vas a poder

avanzar (RTA: 0)

En los otros casos, se puede ver que la respuesta puede ser todas o casi todas (mínimo M-2 es trivial de ver haciendo operaciones random hasta la última). Para ver cual es la respuesta final, tenemos esta condición importante:

● Condición Necesaria: Si solamente hay 1 empresa distinta a la tuya la final nunca va a poder ser la tuya. (pues todas las operaciones siguen dejando exactamente 1 empresa distinta)

Page 11: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema F: Fusión de Empresas (cont)● Esa condición necesaria es SUFICIENTE excepto en el caso maldito (1,1,1,0)

que el primer paso te obliga a crear el 4to tipo y luego se cumple esa propiedad para el 4to. (RTA: 3)

● En todos los otros es M - (cantidad de empresas que tengan solo 1 que no sea la suya), o sea M, M-1 o M-2.

La demostración no es necesaria hacer en la prueba, pero vamos a dejar un esbozo de una demostración constructiva:

Lema: Excepto en el caso borde y los dos iniciales, una empresa X puede ser la última en quedar si y solo si inicialmente hay 2 o más empresas distintas.

Page 12: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema F: Fusión de Empresas (cont)Demostración Constructiva: (X la empresa que queremos generar)

● Si hay alguna de tu empresa:○ Sin llegar a un estado inconsistente (que no pueda avanzar) voy reduciendo hasta dejar dos

empresas distintas a X (o1 y o2). ■ Si o1 != o2, genero X y ya está: Solo hay X.■ Si o1 == o2: Reduzco entre las X hasta dejar 1, genero con X y o1 un extra (tiene que haber

porque el caso M = 2 se vio antes) y con el extra y o2 genero X

● Si no hay ninguna de X:○ Empiezo dejando exactamente 1 del mínimo de las otras (reduciendo entre ellas)

■ Si N >=4, genero con el más chico y uno random el tuyo y paso al caso anterior ■ Si N = 1, eran todos iguales. Caso ya visto.■ Si N = 2, deben ser distintos. Agarro los dos y genero X.■ Si N = 3, hay dos casos:

● (2,1) -> (1,1) -> X● (1,1,1) -> (0,0,1,1) (Si M >= 5) -> Genero X. El problema es cuando M = 4. Caso Borde.

Page 13: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema G: Galileo Galilei● Hay que hallar la cantidad de triángulos rectángulos.● N<=300 Podemos hacerlo en O(N^3) y probar todas las posibles ternas de

puntos a b c y ver si es un rectángulo con el ángulo respectivo a c recto (esto nos garantiza no contar repetidos).

● Para el chequeo de si es rectángulo podemos usar teorema de Pitágoras o producto escalar.

Page 14: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema H: Hambre de gloria● Es fácil ver que un punto c puede ser centro de una circunferencia válida

cuando la distancia de c a cada uno de los puntos toma a lo sumo 2 valores.● Cuando toma 1 sólo valor (hay una circunferencia que pasa por todos),

entonces cualquier circunferencia con ese centro es válida y la rta. es INF. Para ver si se da este caso, podemos chequear n=2 o que el circuncentro de los 3 primeros puntos esté a igual distancia de todos.

● Cuando toma 2 valores A y B, entonces se puede trazar una circunferencia válida con radio (A+B)/2 cuyo valor (longitud de la carrera) es |A-B|/2.

● Para los casos que faltan, probamos algunos puntos como centro y acumulamos el valor máximo que vamos encontrando.

Page 15: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema H: Hambre de gloria (cont.)● Si n >= 5, si hay un centro válido c, entonces 3 de los primeros 5 puntos

están a igual distancia de c. Entonces alcanza con probar los circuncentros de todas las ternas de los primeros 5 puntos.

● Si n = 3, queda por tratar el caso en que son colineales (sino es INF). El centro debe estar en alguna mediatriz de un par de ellos. Es simple ver que el punto óptimo entre todos los de la mediatriz es el punto medio del par. Entonces probamos los puntos medios de todos los pares.

● Si n = 4 es el caso más complicado: Debemos probar los circuncentros de 3, la intersección de las dos mediatrices si los dividimos en 2 pares (probamos todas las formas) y los puntos medios (cuando son colineales).

Page 16: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema I: Indecisos● El problema más fácil● Nos dan una cantidad P de votos positivo, N negativos e I indecisos y

queremos saber si una ley va a salir con seguridad positiva o negativamente o si depende de los indecisos

● Si P > N+I claramente va a ser positiva si o si● Si N >= P+I claramente va a ser negativa (guarda con el igual!, pues tienen

que ser más positivos)● En el resto de los casos se puede ver que depende de los Indecisos :)

Page 17: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema J: Jugando con cadenas● Se puede probar que una estrategia óptima para cada jugador es siempre

elegir la última aparición del carácter en S.● Sea S' la cadena compuesta por todos los caracteres distintos de S en el

mismo orden en el que aparecen en S. Es fácil de ver que toda subsecuencia de longitud impar de S' es solución.

● Sea T una cadena que es solución. Existe una subsecuencia maximal de longitud impar de S' que es prefijo de T.

● De esta última observación se sigue que es posible construir cada solución comenzando con una subsecuencia impar de S' y agregando caracteres a la derecha de manera apropiada.

Page 18: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

● Como la longitud de S' es a lo sumo 26 y los caracteres que componen a S' no influyen en el resultado, no es muy difícil calcular la respuesta en O(|S| + poly(|S'|)).

● Ejercicio. Resolverlo con alfabeto de tamaño O(|S|).● Alternativamente, podemos hacer una DP f(K,M,S) “cantidad de cadenas T

de longitud M tal que si la cadena de la entrada contiene K caracteres distintos entonces es ganadora para S=0 y perdedora S=1. La respuesta nos queda sum [ f(K,n,0) ] (1<=n<=N) siendo K la cantidad de caracteres distintos en la cadena de la entrada.

○ f(K,0,S) = if S==1 then 1 else 0;○ f(K,M,1) = (26-K)*K^(M-1) + sumatoria con 0<=k<K [ f(k, M-1,0) ] ○ f(K,M,0) = sumatoria con 0<=k<K [ f(k, M-1,1) ]

● La solución es O(N*K^2) siendo K el tamaño del alfabeto.● Podríamos bajarlo a O(N*K) si tomamos g como:

○ g(K,M,S) = f(K, M, S) - f(K-1, M, S).○ Esta g se computa sin hacer un for en la DP (cada estado en O(1)).

Page 19: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema K: Kilómetros ahorrados● El problema pide calcular cuál es el punto de un árbol (puede estar en una

arista) que minimiza la suma de las distancias al cuadrado a todos los nodos.● Si fijamos el punto en una arista, se puede calcular su valor si tenemos para

los dos subárboles que resultan de borrar esa arista:○ La cantidad de nodos (llamémoslas q0 y q1, o sea q0+q1=n).○ La suma de las distancias de los nodos a el extremo de la arista (s0 y s1).○ La suma de las distancias al cuadrado de los nodos al extremo de la arista (w0 y w1).

● Si el punto sobre la arista está a distancias c0 y c1 de los nodos (c0+c1=c (costo de la arista)), entonces el valor de ese punto es:

● w0+2*s0*c0+q0*c0^2 + w1+2*s1*c1+q1*c1^2● (Se llega a esta fórmula escribiendo la distancia del punto a un nodo como la

distancia al nodo + lo que recorrí de la arista, y despejando).

Page 20: Ideas para resolver los Problemas :) · Se puede simular (en compu o en papel) los primeros dígitos de la contraseña de Laino. Al hacerlo vemos que es: 462483261224832 Notar que

Problema K: Kilómetros ahorrados (cont.)● En la cuenta anterior, si reemplazamos c1 por (c-c0) nos queda una función

cuadrática sobre c0, que se puede minimizar derivando e igualando a 0.● Ya sabemos cómo minimizar dado que está en una arista en particular. Falta

calcular eficientemente q0,q1,s0,s1,w0,w1 para cada arista.● Esto puede resolverse mediante dos DFS. El primero para calcular los

valores para cada subárbol (es decir, todos los nodos “debajo de un nodo”). El segundo para calcular para cada arista los valores para el otro subárbol (el de “arriba”).

● Para el primero, los valores de un nodo se pueden calcular dependiendo de los valores de los hijos.

● Para el segundo, mantenemos los valores del subárbol “de arriba” como parámetros de la recursión.