Le problème du secrétaire est un problème célèbre décrit comme suit:
- Vous avez besoin d'une nouvelle secrétaire
- Vous avez N candidats que vous pouvez interroger un à la fois
- Vous pouvez noter chaque candidat après l'entretien. Votre système de notation ne donnera jamais à deux candidats le même score
- Après avoir interviewé un candidat, vous devez immédiatement dire «oui» ou «non»
- Vous souhaitez que le candidat avec le score le plus élevé
La solution consiste à interroger les premiers floor(N/e)
candidats, puis à accepter le premier candidat qui a obtenu un score plus élevé que tous les candidats précédents. Si aucun des candidats n'est supérieur, renvoyez le dernier candidat. Chose intéressante, cela donne au candidat le plus haut 1/e
pourcentage du temps. e
fait référence au numéro d' Euler . Pour obtenir la valeur de e
, vous pouvez utiliser un code intégré log
, ou le coder en dur avec au moins 5 décimales.
Contribution:
Un tableau non vide d'entiers non négatifs uniques pas plus de 2^31-1
.
Production:
Un entier représentant le candidat choisi. Pour être clair, l'algorithme est:
- Trouvez l'élément maximum dans les premiers
floor(N/e)
éléments du tableau. - Parcourez les éléments restants et renvoyez le premier élément supérieur au maximum trouvé à l'étape 1.
- Si aucun des éléments n'est supérieur, retournez le dernier élément.
Par exemple, supposons que votre tableau était [2,7,4,3,9,20]
, ainsi N = 6
et floor(N/e) = 2
. Les 2 premiers éléments du tableau sont [2,7]
. Le maximum de [2,7]
est 7
. Les éléments restants sont [4,3,9,20]
. Le premier élément qui est supérieur à l' 7
est 9
, alors nous revenons 9
.
Cas de 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
Votre solution doit être O(n)
, où n
est la longueur du tableau. Si votre langue a une fonction intégrée qui trouve le maximum d'un tableau, vous pouvez supposer que la fonction prendO(n)
(et j'espère que c'est le cas).
Les échappatoires standard s'appliquent, et c'est un code-golf , alors faites la réponse la plus courte dans votre langue préférée!
e
(par exemple Python, où e=2.71828
est plus court que import math;math.E
)
e
faut-il utiliser?