Contents
Problem
給你一段一段的小棍子,使它們組成長度相同的木棍,求出長度最小為?
Solution
基本上跟 10364 - Square 有點類似,但剪枝的要求更高,拿了不少次 TLE , 2 秒多 AC ,最後又修改了一番才加速到 0.1 秒。
以下幾個要處理的部分:
- 排序後,從長的開始組,減少回溯次數
- 組成的棍子長度必定大於等於小段棍子中最長的,且為全部棍子相加後的因數
- 要組成一根完整的棍子時的第一段,此時還沒有替這根組任何小段棍子,也就是長度為 0 。如果剩下沒使用的第一根小棍子不能組,接下來也不會行,因為第一根會剩下來。
- 一樣長度且沒有用到,可以跳過
- 如果現在長度可以完成一根完整的棍子,但遞迴還是失敗,代表之後一定會有無法組完的。此時就算你用別段小棍子完成這根棍子,也無法成功組完每一段小棍子,所以可以提早結束這種長度。
第 5 點影響效率蠻大的,拉快了不少時間。
以上的解釋有些可能不太清楚(有錯就抱歉了…),可以自行揣摩看看。
Code
1 |
|