Il problema del segretario è un famoso problema descritto così:
- Hai bisogno di un nuovo segretario
- Hai N candidati che puoi intervistare uno alla volta
- Sei in grado di segnare ciascun candidato dopo il colloquio. Il tuo sistema di punteggio non assegnerà mai a due candidati lo stesso punteggio
- Dopo aver intervistato un candidato, è necessario fornire immediatamente un "sì" o "no"
- Vuoi il candidato con il punteggio più alto
La soluzione è di intervistare i primi floor(N/e)
candidati e quindi accettare il primo richiedente che ha un punteggio più alto rispetto a tutti i precedenti candidati. Se nessuno dei candidati è superiore, restituisce l'ultimo richiedente. Abbastanza interessante, questo dà il miglior candidato 1/e
percentuale del tempo. e
si riferisce al numero di Eulero . Per ottenere il valore di e
, è possibile utilizzare un built-in log
o codificarlo con almeno 5 punti decimali.
Ingresso:
Un array non vuoto di interi univoci non negativi non più di 2^31-1
.
Produzione:
Un numero intero che rappresenta il candidato scelto. Per essere chiari l'algoritmo è:
- Trova l'elemento massimo nei primi
floor(N/e)
elementi dell'array. - Scorrere gli elementi rimanenti e restituire il primo elemento che è superiore al massimo trovato nel passaggio 1.
- Se nessuno degli elementi è superiore, restituisce l'ultimo elemento.
Ad esempio, supponiamo che il tuo array fosse [2,7,4,3,9,20]
, quindi N = 6
e floor(N/e) = 2
. I primi 2 elementi dell'array sono [2,7]
. Il massimo di [2,7]
è 7
. Gli elementi rimanenti sono [4,3,9,20]
. Il primo elemento che è maggiore di 7
è 9
, quindi torniamo9
.
Casi test:
[0] => 0
[100] => 100
[100, 45] => 100
[0, 1] => 0
[45, 100] => 45
[1, 4, 5] => 4
[1, 5, 4] => 5
[5, 4, 1] => 1
[5, 1, 4] => 4
[4, 1, 5] => 5
[56, 7, 37, 73, 90, 59, 65, 61, 29, 16, 47, 77, 60, 8, 1, 76, 36, 68, 34, 17, 23, 26, 12, 82, 52, 88, 45, 89, 94, 81, 3, 24, 43, 55, 38, 33, 15, 92, 79, 87, 14, 75, 41, 98, 31, 58, 53, 72, 39, 30, 2, 0, 49, 99, 28, 50, 80, 91, 83, 27, 64, 71, 93, 95, 11, 21, 6, 66, 51, 85, 48, 62, 22, 74, 69, 63, 86, 57, 97, 32, 84, 4, 18, 46, 20, 42, 25, 35, 9, 10, 19, 40, 54, 67, 70, 5, 44, 13, 78, 96]
=> 98
[10, 68, 52, 48, 81, 39, 85, 54, 3, 21, 31, 59, 28, 64, 42, 90, 79, 12, 63, 41, 58, 57, 13, 43, 74, 76, 94, 51, 99, 67, 49, 14, 6, 96, 18, 17, 32, 73, 56, 7, 16, 60, 61, 26, 86, 72, 20, 62, 4, 83, 15, 55, 70, 29, 23, 35, 77, 98, 92, 22, 38, 5, 50, 82, 1, 84, 93, 97, 65, 37, 45, 71, 25, 11, 19, 75, 78, 44, 46, 2, 53, 36, 0, 47, 88, 24, 80, 66, 87, 40, 69, 27, 9, 8, 91, 89, 34, 33, 95, 30]
=> 30
La soluzione deve essere O(n)
, dov'è n
la lunghezza dell'array. Se la tua lingua ha un builtin che trova il massimo di un array, puoi presumere che la funzione abbiaO(n)
(e si spera lo sia).
Si applicano scappatoie standard, e questo è un codice-golf , quindi fai la risposta più breve nella tua lingua preferita!
e
(ad esempio Python, dove e=2.71828
è più corto di import math;math.E
)
e
dovrebbe essere usato?