Ho cercato di pensare da ORE a questo problema con TopCoder e non sono riuscito a trovare una soluzione perfettamente funzionante e ho trovato quello indicato di seguito che è follemente usato!Perché questo codice funziona per questo problema TopCoder?
Sto cercando di capire come funziona questa soluzione per il dato problema? E come avrei potuto pensarci inizialmente? Dopo aver letto la soluzione, ho pensato che fosse una variante della codifica di Huffman, ma è il massimo che ho potuto ottenere. Sono davvero affascinato e vorrei sapere quale linea di pensiero potrebbe portare a questa soluzione ..
Ecco il problema: http://community.topcoder.com/stat?c=problem_statement&pm=11860&rd=15091
Fox Ciel ha un sacco di compiti da fare. I compiti sono costituiti da alcune attività indipendenti tra loro . Compiti diversi possono richiedere diversi importi di tempo per il completamento. Ti viene data una [] workCost. Per ogni i, l'attività i-es richiede workCost [i] secondi per il completamento. Vorrebbe far partecipare una festa a e incontrare i suoi amici, quindi desidera completare tutte le attività il più rapidamente possibile.
Il problema principale è che tutti i volpi, incluso Ciel, odiano davvero fare i compiti . Ogni volpe è solo disposta a svolgere uno dei compiti. Fortunatamente, Doraemon, un gatto robotico del XXII secolo, diede a Fox Ciel un martello diviso : un aggeggio magico che può dividere qualsiasi volpe in due volpi.
Viene fornito un splitCost int. L'uso del martello diviso su una volpe è istantaneo. Una volta che un martello viene usato su una volpe, la volpe inizia a dividere . Dopo una frazione di secondi, si trasformerà in due volpi: la volpe originale e un'altra volpe completamente nuova. Mentre una volpe si divide, non è permesso usare di nuovo il martello su di lei.
Il lavoro su un'attività non può essere interrotto: una volta che una volpe inizia a lavorare su un'attività, deve terminarla. Non è consentito a più volpi di collaborare nello stesso compito. Una volpe non può lavorare su un'attività mentre lei è divisa usando il martello. È possibile dividere più volte la stessa volpe . È possibile dividere una volpe sia prima che dopo lei risolve una delle attività.
Calcola e restituisci il tempo minimo in cui le volpi possono risolvere tutte le attività.
Ed ecco la soluzione che ho trovato su questo link
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();
}
}
La coda di priorità restituisce l'elemento massimo o l'elemento min quando si esegue il polling? – ElKamina
Almeno. Le code prioritarie sono ordinate dal minimo all'elemento più grande e mantengono il loro ordinamento su un inserto. – Charles
Questa risposta sembra errata. Considera 'minTime (new int [] {1, 1, 1}, 5)'. Ovviamente la cosa giusta da fare è non parallelizzare nessuno dei compiti, così che ci vogliono 3 secondi. Questa soluzione darebbe 11s! –