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!
la source
e
faut-il utiliser?e
(par exemple Python, oùe=2.71828
est plus court queimport math;math.E
)Réponses:
Gelée, 13 octets
Certainement un algorithme O (n) , espérons-le une implémentation O (n) . Essayez-le en ligne!
Comment ça fonctionne
la source
CJam, 20 octets
Fonctionne de manière similaire à la suggestion de Dennis.
la source
$W=
ne fonctionne pas en temps linéaire.:e>
(réduire au maximum)Java,
128118 octetsDentelé:
la source
MATL ,
272523 octetsUtilise la même approche que la réponse CJam d'A. Simmons .
Essayez-le en ligne!
la source
JavaScript (ES6) 64
Moins golfé
Tester
la source
Ruby, 64 octets
la source
a.find
dans la deuxième étape, même si évidemment c'est beaucoup moins efficace.(0...c)
pour une plage qui exclut c.PARI / GP , 70 octets
Cela peut avoir des problèmes sur les anciennes versions de gp quand on lui donne un singleton, mais cela fonctionne au moins à partir de la révision 18487.
la source
JavaScript (ES6), 79 octets
Fonctionne car
findIndex
retourne-1
en cas d'échec, maisa.slice(-1)[0]
renvoie le dernier élément du tableau comme souhaité.la source
Python 2, 87 octets
L'utilisateur entre le tableau sous forme de liste, avec crochets et virgules. Python 2
input()
commande de est pratique ici.Que nous mettions fin au processus tôt ou non, nous embauchons la dernière personne interrogée.
la source
Perl 6, 43 octets
Je pense que c'est O (n)
la source
Python 3.5; 110 octets:
Fondamentalement, ce qui précède fait qu'il prend d'abord un tableau fourni, "h" tant qu'il comprend plus de 5 éléments (pour l'instant ...), trouve la valeur maximale dans le premier (longueur du tableau (len (h )) / Nombre d'Euler (à 5 décimales)) des éléments de ce tableau, puis renvoie cette valeur sous la forme "k". De plus, "n" est la valeur maximale dans le reste du tableau. Enfin, la valeur renvoyée par la fonction est la valeur maximale dans un tableau contenant à la fois "k" et "n".
Remarque: La
max()
fonction de Python est la complexité O (n).Ci-dessous, un golf sans code plus lisible la version du code ci - dessus qui a un aléatoire, unique tableau 10 élément fourni, confirmer que cela fonctionne:
la source