Почему этот код работает для этой проблемы TopCoder?

Я ЧАСОВ пытался обдумать эту проблему с TopCoder и не смог найти идеально работающее решение, и нашел приведенное ниже, которое безумно красиво используется!

Я пытаюсь понять, как это решение работает для данной задачи? И как я мог изначально подумать об этом? Прочитав решение, я понял, что это вариант кодирования Хаффмана, но это все, что я мог получить. Я действительно в восторге и хотел бы знать, какой ход мыслей может привести к этому решению..

Вот проблема: http://community.topcoder.com/stat?c=problem_statement&pm=11860&rd=15091

Фокс Сиэль должен сделать много домашней работы. Домашнее задание состоит из нескольких взаимонезависимые задачи. Разные задачи могут занимать разное количество времени для завершения. Вам дается int[] workCost. Для каждого я, i -выполнение этой задачи занимает workCost[i] секунд. Она хотела бы пойти на вечеринку и встретиться с друзьями, поэтому она хочет закончить все задания как можно быстрее.

Основная проблема в том, что все лисы, включая Сиэля, действительно ненавидят домашнее задание. Каждая лиса готова выполнить только одно из заданий. К счастью, Дораэмон, робот-кот из 22-го века, расколол Фокса Сиэля молоток :волшебное приспособление, способное разделить любую лису на двух лисиц.

Вам дается int splitCost. Использование расколотого молота на лисе мгновенный. Как только молот используется на лисе, лиса начинает расколоть. Через splitCost секунд она превратится в двух лис --оригинальная лиса и еще одна совершенно новая лиса. Пока лиса расщепляется, нельзя снова использовать на ней молот.

Работа над задачей не может быть прервана :как только лиса начинает работать над задача, она должна закончить ее. Не допускается, чтобы несколько лис сотрудничать в решении одной задачи.Лиса не может работать над задачей, пока она раскалывается с помощью молотка. Можно расколоть ту же лису многократно. Разделить лису можно как до, так и после она решает одну из задач.

Вычислите и верните наименьшее количество времени, за которое лисы могут решить все задачи.

И вот решение, которое я нашел по этой ссылке

import java.util.*; 

public class FoxAndDoraemon { 
  public int minTime(int[] workCost, int splitCost) { 
    PriorityQueue pq = new PriorityQueue(); 

    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(); 

  } 
}

6
задан iCodez 21 January 2015 в 21:25
поделиться