1117 聰明的木匠 (貪心)
阿新 • • 發佈:2018-11-30
1117 聰明的木匠
1 秒 131,072 KB 20 分 3 級題
思路:
第一次切割Li, 花費體力:M
第二次切割Lj,花費體力:M-Li
第三次切割Ls,花費體力:M-Li-Lj
N次切割後花費體力為:M-Li-Lj-……-Lk
那麼,花費的總體力為NM-(N-1)Li-(N-2)Lj-……-Lk
顯然,要使得總體力最少,只要Li>Lj>……>Lk
那麼思路很明確了
程式碼:
package _51_node.greedy; import java.util.PriorityQueue; import java.util.Scanner; public class ex_1177 { /** * 1177 聰明的木匠 * 按每段大小由大到小切割就可以使體力最少. * 證明: L1+L2+……+LN=M * 第一次切割Li, 花費體力:M * 第二次切割Lj,花費體力:M-Li * 第三次切割Ls,花費體力:M-Li-Lj * 如此下去, * N次切割後花費體力為:M-Li-Lj-……-Lk * 那麼,花費的總體力為NM-(N-1)Li-(N-2)Lj-……-Lk * 顯然,要使得總體力最少,只要Li>Lj>……>Lk */ static PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(); public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); for (int i = 1; i <= n; i++) { int x = cin.nextInt(); priorityQueue.add(x); } System.out.println(solve()); } public static int solve() { int ans = 0; while (priorityQueue.size() >= 2) { int x = priorityQueue.poll(); int y = priorityQueue.poll(); ans += x + y; priorityQueue.add(x + y); } return ans; } }