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≥⋯≥LnO(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 ) .s1 ≤ s ≤ k1 , ... , skLs1 , ... , s - 1kLs - 1O ( 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 :oLs - 1> o ≥ Lso > Lsoo
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 iyo1 ≤ i ≤ sLsryo , dondej≤riyLiLyojj ≤ 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 )