Come suggerito da @randomA, procederemo in due fasi: prima troviamo la serie di bastoncini che verranno tagliati e quindi ridurre al minimo il numero di tagli.
Come nel caso speciale della domanda, ordiniamo / denominiamo i bastoncini in modo che . Questo richiede tempo . O ( n registro n )L1≥ L2≥ ⋯ ≥ LnO ( n logn )
Come ha sottolineato @utente1990169, non dobbiamo mai tagliare un pezzo .i ≥ k
Nella prima fase utilizziamo una ricerca binaria per trovare il numero , , in modo che i bastoncini possano essere tagliati in almeno pezzi della taglia (più alcuni pezzi più piccoli) , ma i bastoncini non possono essere tagliati in pezzi della dimensione . Questo richiederà tempo .1 ≤ s ≤ k 1 , … , s k L s 1 , … , s - 1 L s - 1 O ( k log k )S1 ≤ s ≤ k1 , ... , sKLS1 , … , s - 1KLs - 1O ( k logk )
Se , questo valore è la dimensione ottimale e possiamo saltare la seconda fase.Ls - 1= LS
Altrimenti sappiamo che la dimensione ottimale soddisfa e se allora risulta dal taglio di almeno uno dei bastoncini in pezzi di uguali dimensioni. La fase due determinerà :L s - 1 > o ≥ L s o > L s o ooLs - 1> o ≥ LSo > LSoo
Per ogni stick , , determinare un set di dimensioni candidate come segue: Se il taglio in pezzi di dimensioni trasforma il bastone in pezzi (incluso quello più corto, se presente), quindi i candidati per questo stick sono tutti i valori , dove e . (Vedi la risposta di @ user1990169 per il motivo per cui queste sono le uniche dimensioni candidate.)1 ≤ i ≤ s L s r i L iio1 ≤ i ≤ sLSrio j≤riLiLiojj ≤ rioLioj< Ls - 1
Mantenere per ogni dimensione del candidato, quanto spesso si è verificato. Utilizzando un albero di ricerca bilanciato, ciò può essere fatto in , poiché il numero totale di dimensioni candidate è vincolato da .∑ i r i ≤ 2 kO ( k logk )Σiorio≤ 2 k
Ora la dimensione del candidato che si è verificata più spesso e porta a un taglio valido è quella che ci offre la soluzione ottimale. Inoltre, se qualsiasi dimensione candidata porta a un taglio valido, anche una dimensione più piccola porterà a un taglio valido.
Quindi possiamo nuovamente utilizzare la ricerca binaria per trovare la lunghezza del candidato più grande che porta a un taglio valido in . Quindi ripetiamo l'insieme delle lunghezze dei candidati fino a questa soglia e troviamo quello con la più grande moltitudine tra loro in .O ( k )O ( k logk )O ( k )
In totale otteniamo un runtime in o , se ignoriamo (o non dobbiamo fare) l'ordinamento iniziale.O ( k registro k )O ( n logn )O ( k logk )