LA DOMANDA:
C'è un evento in cui ci sono N concorrenti. Ci sono tre compiti nell'evento: A, B, C (per esempio). Ogni partecipante prende parte agli eventi nell'ordine elencato: un concorrente deve prima completare A e B prima di iniziare C.
Tuttavia, nell'evento A può partecipare solo una persona alla volta. Qualsiasi numero di persone può partecipare contemporaneamente a B e C.
Quindi l'evento funziona come segue. Al momento 0, il primo concorrente inizia A, mentre i restanti cittadini attendono che la prima persona finisca. Non appena la prima persona ha finito, lui o lei procede all'evento B, e il secondo cittadino inizia A. In generale ogni volta che una persona completa A, la persona successiva inizia A. Ogni volta che una persona ha finito con A, lui o lui lei procede immediatamente verso B, indipendentemente da ciò che fanno gli altri concorrenti. L'intero evento termina non appena tutti i concorrenti finiscono tutti e 3 gli eventi.
Quindi alla domanda di base viene dato il numero di partecipanti N e il tempo impiegato da ciascuna persona per ciascuno dei 3 eventi, calcolare il tempo minimo in cui l'intero evento potrebbe essere completato.
IL MIO TENTATIVO:
Questo è l'algoritmo che ho trovato:
LeastTime (persone (2d array [n] [3] con il tempo di ogni persona per ogni evento, n, front_chosen = false)
The least time for n people can be broken up into 2 cases:
1. The current guy seated first for event A
1.1 We take t1_1 -> time for current guy in event A + time taken for the rest of the people to finish the whole event with the front taken
1.2 We take t1_2 -> time for current guy in event A + time for his remaining events
1.3 The time taken for the whole event in this case is t1 = max{t1_1,t1_2}.
2 The current guy is not seated first for event A
2.1 We modify people such that the first element is placed last
2.2 t2 -> LeastTime(people, n, false)
3. We return min {t1,t2}
Quindi è quello che mi è venuto in mente. Quali sono alcuni migliori soluzioni più efficienti? Anche le soluzioni alternative saranno utili.