从 HOURS 开始,我一直在尝试思考这个 TopCoder 问题,但无法提供完美的解决方案,并发现下面给出的解决方案使用得非常漂亮!
我试图弄清楚这个解决方案如何适用于给定的问题?而我当初怎么会想到呢?在阅读了解决方案后,我认为它是霍夫曼编码的一种变体,但这是我所能得到的。我真的很着迷,想知道什么样的思路可以导致这个解决方案..
这是问题所在:http: //community.topcoder.com/stat ?c=problem_statement&pm=11860&rd=15091
Fox Ciel 有很多功课要做。作业由一些相互独立的任务组成。不同的任务可能需要不同的时间来完成。您将获得一个 int[] workCost。对于每个 i,第 i 个任务需要 workCost[i] 秒才能完成。她想参加一个聚会和认识她的朋友,因此她想尽快完成所有任务。
主要的问题是,包括夏尔在内的所有狐狸都非常讨厌做作业。每只狐狸只愿意做其中一项任务。幸运的是,来自 22 世纪的机器猫哆啦A梦给了 Fox Ciel 一把分裂锤:一个可以将任何狐狸分成两只狐狸的魔法小工具。
你得到一个 int splitCost。在狐狸身上使用劈锤是瞬间的。一旦在狐狸身上使用锤子,狐狸就会开始分裂。splitCost 秒后,她会变成两只狐狸——原来的狐狸和另一只全新的狐狸。狐狸在劈叉时,不能再用锤子打她。
一项任务的工作不能被打断:一旦狐狸开始执行一项任务,她就必须完成它。不允许多只狐狸在同一任务上合作。狐狸在使用锤子被劈开时无法完成任务。可以多次拆分同一只狐狸。在狐狸完成其中一项任务之前和之后都可以分裂狐狸。
计算并返回狐狸可以解决所有任务的最短时间。
这是我在此链接上找到的解决方案
import java.util.*;
public class FoxAndDoraemon {
public int minTime(int[] workCost, int splitCost) {
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
for(int i : workCost) pq.offer(i);
while(pq.size()>=2) {
int i = pq.poll();
int j = pq.poll();
pq.offer(Math.max(i, j) + splitCost);
}
return pq.poll();
}
}