Tienes palos de longitudes arbitrarias, no necesariamente integrales.
Al cortar algunos palos (un corte corta un palo, pero podemos cortar con la frecuencia que queramos), desea obtener palos de manera que:
- Todos estos palos tienen la misma longitud;
- Todos los palos son al menos tan largos como todos los demás palos.
Tenga en cuenta que obtenemos palos después de realizar cortes enC
¿Qué algoritmo usarías para que el número de cortes necesarios sea mínimo? ¿Y cuál es ese número?
Como ejemplo, tome y cualquier . Se puede usar el siguiente algoritmo:n ≥ 2
- Ordene los palos por orden descendente de longitud tal que .
- Si , corte el palo # 1 en dos piezas iguales. Ahora hay dos palos de longitud , que son al menos tan largos como los palos restantes .L 1 / 2 2 ... n
- De lo contrario ( ), corte palo # 1 a dos piezas desiguales de tamaños y . Ahora hay dos palos de longitud , que es más larga que y los otros palos .L 2 L 1 - L 2 L 2 L 1 - L 2 3 … n
En ambos casos, un solo corte es suficiente.
Traté de generalizar esto a más grande , pero parece que hay muchos casos a considerar. ¿Puedes encontrar una solución elegante?
fuente
Como sugirió @randomA, procederemos en dos fases: primero encontramos el conjunto de palos que se cortarán y luego minimizamos el número de cortes.
Como en el caso especial de la pregunta, clasificamos / nombramos los palos para que . Esto lleva tiempo O ( n log n ) .L1≥L2≥⋯≥Ln O(nlogn)
Como señaló @ user1990169, nunca tenemos que cortar una pieza .i≥k
En la primera fase, empleamos una búsqueda binaria para encontrar el número , 1 ≤ s ≤ k , de modo que los palos 1 , ... , s puedan cortarse en al menos k piezas de tamaño L s (más algunas piezas más pequeñas), pero los palos 1 , ... , s - 1 no se pueden cortar en k piezas de tamaño L s - 1 . Esto llevará tiempo O ( k log k ) .s 1 ≤ s ≤ k 1 , ... , s k Ls 1 , ... , s - 1 k Ls - 1 O ( k logk )
Si , este valor es el tamaño óptimo y podemos omitir la fase dos.Ls - 1= Ls
De lo contrario, sabemos que el tamaño óptimo satisface L s - 1 > o ≥ L s y si o > L s entonces o resulta de cortar al menos uno de los palos en piezas de igual tamaño. La fase dos determinará o :o Ls - 1> o ≥ Ls o > Ls o o
Para cada palo , 1 ≤ i ≤ s , determinar un conjunto de tamaños candidatos como sigue: Si el corte en trozos de tamaño L s vueltas el palo en r i piezas (incluyendo el más corto, en su caso), entonces el candidatos para este palo son todos los valores L iyo 1 ≤ i ≤ s Ls ryo , dondej≤riyLiLyoj j ≤ ryo . (Consultela respuesta de @ user1990169 para saberpor qué estos son los únicos tamaños candidatos).Lyoj< Ls - 1
Mantenga para cada tamaño de candidato, con qué frecuencia ocurrió. Usando un árbol de búsqueda equilibrado, esto se puede hacer en , ya que el número total de tamaños candidatos está limitado por ∑ i r i ≤ 2 k .O ( k logk ) ∑yoryo≤ 2 k
Ahora, el tamaño del candidato que se produjo con mayor frecuencia y conduce a un corte válido es el que nos da la solución óptima. Además, si cualquier tamaño candidato conduce a un corte válido, cualquier tamaño más pequeño también conducirá a un corte válido.
Entonces podemos emplear nuevamente la búsqueda binaria para encontrar la longitud de candidato más grande que conduzca a un corte válido en . Luego iteramos sobre el conjunto de longitudes de candidatos hasta este umbral y encontramos el que tiene la mayor multitud entre ellos en O ( k ) .O ( k logk ) O ( k )
En total, obtenemos un tiempo de ejecución en , u O ( k log k ) , si ignoramos (o no tenemos que hacer) la ordenación inicial.O ( n logn ) O ( k logk )
fuente
Después de haber ordenado a los palos con el fin de sus longitudes descendente, a continuación, un palo será cortada solamente si todos los palos L 1 , L 2 , . . . L i - 1 han sido cortados.Lyo L1, L2, . . . Li - 1
Ahora, dado que , no haremos ningún corte en los palos L k en adelante, ya que siempre podemos tener k palos con una longitud L k .k < n Lk k Lk
Entonces, en lugar de , estamos tratando con solo k - 1 palos (posiblemente agregando el k -th palo como un todo), y el número máximo de cortes que se requerirán en el peor de los casos = k - 1 .norte k - 1 k = k - 1
Además, si el número óptimo de cortes es , entonces habrá al menos un juego de palos entre esos palos k - 1 que se tomarán como un todo de 1 palo original< k - 1 k - 1 (ya sea en partes o en 1 pieza) , es decir, ninguna parte de ese palo original se dejará 'sin tomar'. Esto se debe a que, según el principio del agujero de paloma , habrá al menos 1 corte que deberá producir más de 1 palo válido.
Luego puede realizar dos bucles anidados (ambos hasta ). El bucle externo indicará el número de palo i cuyas partes deben tomarse y el bucle interno indicará el número de partes j hechas de ese palo. Para cada talla L ik yo j Lyoj L1
verifique si puede obtener palos k factibles cortando palosL1 enadelante secuencialmente y, si puede, actualice los cortes mínimos requeridos hasta ahora si el número requerido actual es menor.
La complejidad total del algoritmo anterior esO ( n l o g( n ) + k3)
fuente
La idea de alto nivel sería la búsqueda binaria.
El tamaño de cada uno de los k sticks solicitados será al menos el más pequeño y, como máximo, el más grande. Debido a esto, procedemos mediante la búsqueda binaria en el tamaño del stick central, veamos qué número podemos obtener, si este k ′ es mayor que el k dado, entonces sabemos que necesitamos elegir un nuevo tamaño de candidato de referencia. Entonces nos movemos al más grande o más pequeño usando un nuevo stick de referencia. Nos detenemos cuando k ′ es menor que kk′ k′ k k′ k
Una vez que hayamos encontrado el palo de referencia apropiado, hay un caso de esquina donde necesitaríamos refinar aún más el tamaño. Podemos ordenar todos los palos cortados por el número de cortes en ellos y el tamaño del palo. Elija el que tenga el menor número de cortes y el menor tamaño. Reduzca el número de cortes en este palo en 1 y haga todos los subgrupos de este tamaño. Este será el nuevo tamaño de referencia, verifique si este nuevo tamaño puede conducir a una aceptable . Lo admito, no sé cómo limitar el tiempo de ejecución en este caso.k′
Con suerte, puedo ver algo útil de otras respuestas.
fuente