Я ЧАСОВ пытался обдумать эту проблему TopCoder и не мог найти идеально работающее решение, и нашел приведенное ниже, которое безумно красиво используется!
Я пытаюсь понять, как это решение работает для данной проблемы? И как я мог изначально подумать об этом? Прочитав решение, я понял, что это вариант кодирования Хаффмана, но это все, что я мог получить. Я действительно в восторге и хотел бы знать, какой ход мыслей может привести к этому решению.
Вот проблема: http://community.topcoder.com/stat?c=problem_statement&pm=11860&rd=15091< /а>
У Фокса Сиэля много домашней работы. Домашнее задание состоит из нескольких независимых друг от друга заданий. Для выполнения разных задач может потребоваться разное количество времени. Вам дается int[] workCost. Для каждого i i-я задача требует workCost[i] секунд для завершения. Она хотела бы посетить вечеринку и встретиться с друзьями, поэтому она хочет выполнить все задания как можно быстрее.
Главная проблема в том, что все лисы, включая Сиэля, очень ненавидят делать домашнюю работу. Каждая лиса готова выполнить только одно из заданий. К счастью, Дораэмон, робот-кот из 22-го века, дал Фоксу Сиэлю расколотый молот: волшебное устройство, которое может разделить любую лису на двух лисиц.
Вам дается 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();
}
}
minTime(new int[] {1, 1, 1}, 5)
. Очевидно, правильно было бы не распараллеливать ни одну из задач, чтобы это заняло 3 секунды. Это решение даст 11 секунд! - person Russell Zahniser   schedule 27.04.2012