Se disponen vasos de agua vacíos en el siguiente orden:
Cuando vierte líquido en el primer vaso si está lleno, entonces el líquido extra fluirá a los vasos 2 y 3 en cantidades iguales. Cuando el vaso 2 está lleno, el líquido extra fluiría a 4 y 5 y así sucesivamente.
Dado un N litros de líquido y la capacidad máxima de cada vaso es de 1 litro, proporcione la cantidad de líquido presente en cualquier vaso si vacía N litros de líquido vertiéndolo en el vidrio completando la función getWaterInBucket(int N, int X)
donde X es el número de vidrio. Entonces, por ejemplo, si quiero tener 4 litros al principio y quiero encontrar el agua en el vaso 3, la función esgetWaterInBucket(4, 3)
¿Cómo resuelvo esto mediante programación? Traté de encontrar una solución matemática usando el triángulo de Pascal. Esto no funcionó. Lo consideré un árbol, así que puedo agregar un parámetro como este getWaterInBucket(BTree root, int N, int X)
y luego intentar una solución recursiva para cada nivel, pero los parámetros no están permitidos en este problema. ¿Hay algo obvio, algún truco?
fuente
Respuestas:
Solo necesitas simular el vertido, algo como
Tal como está, esto no es un árbol. Debido a que se vierten diferentes vasos en los mismos vasos, eso evita que sea un árbol.
fuente
return glasses[N-1]
, porque los números de cristal comienzan en 1 en lugar de 0.Así es como respondería esta pregunta en una situación de entrevista (no he visto esta pregunta antes, y no miré las otras respuestas hasta que tuve mi solución):
Primero, traté de resolverlo (lo que usted llamó la "solución matemática") y cuando llegué al vidrio 8 me di cuenta de que sería más difícil de lo que parecía porque el vidrio 5 comienza a desbordarse antes que el vidrio 4. En ese punto, decidió seguir la ruta de la recursividad (solo un FYI, muchas preguntas de entrevistas de programación requieren recursividad o inducción para resolverlas).
Pensando recursivamente, el problema se vuelve mucho más fácil: ¿cuánta agua hay en el vaso 8? La mitad de la cantidad que se ha derramado de los vasos 4 y 5 (hasta que esté lleno). Por supuesto, eso significa que tenemos que responder cuánto se ha derramado de los vasos 4 y 5, pero resulta que tampoco es demasiado difícil. ¿Cuánto se ha derramado del vidrio 5? La mitad de lo mucho que se derramó de los vasos 2 y 3, menos el litro que quedó en el vaso 5.
Resolver esto completamente (y desordenadamente) da:
En este punto (o mientras escribía esto), le diría al entrevistador que esta no es la solución ideal en producción: hay un código duplicado entre
howMuchSpilledOutOf()
ygetWaterInBucket()
; debe haber una ubicación central que asigne los cubos a sus "alimentadores". Pero en una entrevista, donde la velocidad y la precisión de la implementación son más importantes que la velocidad de ejecución y mantenimiento (a menos que se indique lo contrario), esta solución es preferible. Luego, ofrecería refactorizar el código para estar más cerca de lo que considero calidad de producción, y dejar que el entrevistador decida.Nota final: estoy seguro de que mi código tiene un error tipográfico en alguna parte; También se lo mencionaría al entrevistador y le diría que me sentiría más seguro después de refactorizarlo o probarlo en la unidad.
fuente
this isn't the ideal solution
.Pensando en esto como un problema de árbol es una pista falsa, es realmente un gráfico dirigido. Pero olvídate de eso.
Piense en un vaso en cualquier lugar debajo del superior. Tendrá uno o dos vasos encima que pueden desbordarse. Con la elección adecuada del sistema de coordenadas (no se preocupe, vea el final) podemos escribir una función para obtener las gafas "principales" para cualquier vidrio dado.
Ahora podemos pensar en un algoritmo para obtener la cantidad de líquido vertido en un vaso, independientemente del desbordamiento de ese vaso. Sin embargo, la respuesta es que se vierte mucho líquido en cada padre menos la cantidad almacenada en cada vaso padre, dividido por 2. Simplemente suma eso para todos los padres. Escribiendo esto como un fragmento de Python del cuerpo de una función amount_poured_into ():
El máximo () es para garantizar que no tengamos una cantidad negativa de desbordamiento.
¡Ya casi terminamos! Elegimos un sistema de coordenadas con 'y' hacia abajo de la página, los cristales de la primera fila son 0, la segunda fila es 1, etc. Las coordenadas 'x' tienen un cero debajo del cristal de la fila superior y la segunda fila tiene coordenadas x de -1 y +1, tercera fila -2, 0, +2, y así sucesivamente. El punto importante es que el vidrio más a la izquierda o a la derecha en el nivel y tendrá abs (x) = y.
Envolviendo todo eso en python (2.x), tenemos:
Entonces, para obtener la cantidad realmente en un vaso en p, use cantidad_in (total, p).
No está claro en el OP, pero el bit sobre "no puede agregar parámetros" puede significar que la pregunta original debe responderse en términos de los números de vidrio que se muestran. Esto se resuelve escribiendo una función de mapeo a partir de los números de vidrio de muestra en el sistema de coordenadas interno utilizado anteriormente. Es complicado, pero se puede usar una solución iterativa o matemática. Una función iterativa fácil de entender:
Ahora solo reescriba la función cantidad_in () anterior para aceptar un número de vidrio:
fuente
Interesante.
Esto toma el enfoque de simulación.
que imprime (para 6 litros):
que parece ser lo correcto.
fuente
Esta es la función binomial. La proporción del agua entre los vasos de nivel N se puede descubrir usando nCr para cada vaso en el nivel. Además, el número total de anteojos antes del nivel N es la suma de 1 a (N - 1), una fórmula para la cual debería poder encontrar fácilmente disponible. Por lo tanto, dado X, debería poder determinar su nivel y usar nCr para verificar las proporciones de los vasos para ese nivel, y así determinar cuánta agua hay en X, si de todos modos hay suficientes litros para bajar a X.
En segundo lugar, su idea de usar BTree está bien, es solo que BTree es una variable interna, no un parámetro externo.
IOW, si has cubierto estas matemáticas en tu educación (aquí en el Reino Unido se enseña antes de la universidad), entonces deberías poder resolver esto sin demasiados problemas.
fuente