장관 문제 해결


13

장관 문제는 이렇게 설명 유명한 문제이다 :

  1. 새 비서가 필요합니다
  2. 한 번에 하나씩 인터뷰 할 수있는 N 명의 지원자가 있습니다.
  3. 면접 후 각 지원자를 채점 할 수 있습니다. 점수 시스템은 두 명의 지원자에게 동일한 점수를 부여하지 않습니다.
  4. 지원자를 인터뷰 한 후에는 즉시 "예"또는 "아니오"를 제공해야합니다
  5. 당신은 가장 높은 점수를 가진 지원자를 원합니다

해결책은 첫 번째 floor(N/e)지원자 를 인터뷰 한 다음 이전의 모든 지원자보다 높은 점수를받은 첫 번째 지원자를 수락하는 것입니다. 더 높은 지원자가 없으면 마지막 지원자를 반환하십시오. 흥미롭게도, 이것은 최고 지원자 1/e시간의 백분율을 제공합니다 . 오일러 수를e 나타냅니다 . 의 값을 얻으려면 내장을 사용 하거나 소수점 다섯 자리 이상으로 하드 코딩 할 수 있습니다 .elog

입력:

고유하지 않은 음이 아닌 정수로 구성된 비어 있지 않은 배열입니다 2^31-1.

산출:

선택한 후보를 나타내는 정수 알고리즘을 명확히하려면 다음과 같습니다.

  1. floor(N/e)배열 의 첫 번째 요소 에서 최대 요소를 찾으십시오 .
  2. 나머지 요소를 반복하고 1 단계에서 찾은 최대 값보다 큰 첫 번째 요소를 리턴하십시오.
  3. 더 높은 요소가 없으면 마지막 요소를 반환합니다.

예를 들어, 배열했다 말을 [2,7,4,3,9,20]그렇게 N = 6하고 floor(N/e) = 2. 배열의 처음 2 개 요소는 [2,7]입니다. 의 최대 값은 [2,7]입니다 7. 나머지 요소는 [4,3,9,20]입니다. 보다 큰 첫 번째 요소 7이다는 9, 그래서 우리는 반환 9.

테스트 사례 :

[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

솔루션은입니다 O(n). 여기서 n배열의 길이는입니다. 언어에 배열의 최대 값을 찾는 내장 함수가있는 경우 함수가 수행한다고 가정 할 수 있습니다 O(n).

표준 허점이 적용되며 이것은 이므로 가장 좋아하는 언어로 가장 짧은 답변을하십시오!


1
무엇을 e사용해야합니까?
어리석은

2
나는 그것의 가정 @voidpigeon en.wikipedia.org/wiki/E_(mathematical_constant)
손잡이

1
아, 이제 알고리즘이 어떻게 작동하는지 이해합니다. 나는 두 번째 단락이 당신이 바닥 (n / e) 이후에 후보자를 전혀 인터뷰하지 않는 것을 의미한다고 생각했습니다.
손잡이

1
일부 언어에서, 그것이 실제로 내장을 사용하는 것보다 정밀도 5 진수 포인트 변수를 정의하는 짧은 때문에 내가 특별히 부탁 e(예를 들어 파이썬, e=2.71828보다 짧은 import math;math.E)
Mego

1
참고 :`시간의 1 / e 퍼센트. '는 정말 나쁠 것입니다. 1 / e의 확률로 약 37 %의 시간
edc65

답변:


4

젤리, 13 바이트

L:Øe³ḣȯ-Ṁ<i1ị

분명히 O (n) 알고리즘, 희망적으로 O (n) 구현입니다. 온라인으로 사용해보십시오!

작동 원리

L:Øe³ḣȯ-Ṁ<i1ị  Main link. Argument: A (list of scores)

L              Get the length of A.
 :Øe           Divide the length by e, flooring the result.
    ³ḣ         Retrieve the that many scores from the beginning of A.
      ȯ-       Logical OR; replace an empty list with -1.
        Ṁ      Compute the maximum of those scores.
         <     Compare each score in A with that maximum.
          i1   Find the first index of 1 (0 if not found).
            ị  Retrieve the element of A at that index (the last one if 0).

3

CJam, 20 바이트

q~___,1me/i<:e>f>1#=

Dennis의 제안과 유사하게 작동합니다.

q~___                     Read array, duplicate three times
      ,                   Consume one to find the length
       1me/i              Push e then divide and take floor
            <             Take that many elements from the list
             :e>          Find maximum (Thanks to Dennis)
                f>        Label array elements larger than this as 1
                  1#      Find the first one (won't be in set of elements we've looked in)
                    =     Take that element from the final copy of the array. -1 gives us the last element as required

$W=선형 시간으로 실행되지 않습니다.
Dennis

어, 네 말이 맞아 CJam에서 최대 값을 찾는 더 좋은 방법이 있습니까?
시몬스

1
:e>(최대 감소)
Dennis

@Dennis 감사합니다!
시몬스

2

자바 128 118 바이트

a->{int c=(int)(a.length/Math.E),i=0,m=-1,t=0;for(;i<a.length;i++){t=a[i];if(i<c)m=t>m?t:m;if(t>m)return t;}return t;}

들여 쓰기 :

static Function<Integer[], Integer> secretary2 = a -> {
    int c = (int) (a.length/Math.E),     // c = floor(N/E)
        i = 0, m = -1, t = 0;            // declare vars early to save bytes
    for (;i<a.length;i++) {              // for each element of input
        t = a[i];                        // cache element to save bytes
        if (i<c)                         // if before c
            m = t>m ? t : m;             // m = max(m, element)
        if (t>m)                         // if element > m
            return t;                    // return: we've found our best
    }                                    // if never found a good element
    return t;                            // return the last element
};


2

자바 스크립트 (ES6) 64

(a,l=a.length/Math.E,x)=>(a.every(v=>--l>0?x>v?1:x=v:(z=v)<x),z)

덜 골프

(
 a, 
 l=a.length/Math.E, // limit for stage 1
 x // init at undefined
)=>(
  a.every(v => --l > 0 // checking for >0 no need to floor
          ? x>v?1:x=v // stage 1, find max in x, always return truthy
          : (z=v)<x ) // stage 2, set z to current value and exit early if z>x
  , z // at last z has the last seen value
)

테스트

f=(a,l=a.length/Math.E,x)=>(a.every(v=>--l>0?x>v?1:x=v:(z=v)<x),z)

console.log=x=>O.textContent+=x+'\n'

;[ 
 [0], [100], [0,1], [1,2,3],
 [100, 45],
 [45, 100],
 [1, 4, 5],
 [1, 5, 4],
 [5, 4, 1],
 [5, 1, 4],
 [4, 1, 5],   
 [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],
[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]
].forEach(t=>{
  var r=f(t)
  console.log(r+' : '+t)
})
<pre id=O></pre>


1

루비, 64 바이트

->a{m=a[0...c=a.size/Math::E].max
a[c..-1].find{|n|n>m}||a[-1]}

2
@Doorknob 1 층 (N / e) 요소를 한 번 반복하여 최대 값을 찾은 다음 최악의 경우 각 요소를 최대 값과 비교하여 나머지 목록을 반복합니다. 두 부분 모두에서 요소 당 하나의 비교 만 있습니다.
Afuous

아 맞습니다. 나는 각 반복에서 최대 값을 찾고 있다고 오해하고 생각했습니다.
Doorknob

1
실제로, 비록 당신 a.find이 두 번째 단계에서 한다면 여전히 O (n)이라고 생각합니다 . 비록 훨씬 덜 효율적입니다.
histocrat

1
(0...c)c를 제외한 범위에 사용할 수 있습니다 . c.
histocrat

@histocrat 예, O (2n)이어야합니다. O (n)
Charles

1

PARI / GP , 70 바이트

단일 톤을 제공하면 이전 버전의 gp에서 문제가 발생할 수 있지만 적어도 개정판 18487에서 작동합니다.

v->m=vecmax(v[1..t=#v\exp(1)]);for(i=t+1,#v,v[i]>m&&return(v[i]));v[#v]

1

자바 스크립트 (ES6), 79 바이트

a=>(m=Math.max(...a.splice(0,a.length/Math.E)),a.slice(a.findIndex(x=>x>m))[0])

실패시 findIndex리턴 되기 때문에 작동 -1하지만 a.slice(-1)[0]원하는대로 배열의 마지막 요소를 리턴합니다.


1

파이썬 2, 87 바이트

a=input()
t=int(len(a)/2.71828)
m=max(a[:t]+[-1])
for x in a[t:]:
 if x>m:break
print x

사용자는 대괄호와 쉼표로 배열을 목록으로 입력합니다. 파이썬 2의 input()명령은 여기서 편리합니다.

프로세스를 조기에 종료하는지 여부에 관계없이 인터뷰 한 마지막 사람을 고용합니다.


1

펄 6, 43 바이트

나는 이것이 O라고 생각한다

{@^a.first(*>max @a[^floor @a/e])//@a[*-1]}

1

파이썬 3.5; 110 바이트 :

def Interview(h):k=max(h[0:int(len(h)/2.71828)-1]);n=max(h[int(len(h)/2.71828)-1:len(h)-1]);return max([k, n])

기본적으로 위의 작업은 5 개 이상의 항목 (현재는 ...)을 포함하는 한 "h" 제공된 배열을 먼저 가져와 첫 번째 배열 의 최대 값을 찾습니다 (len (h )) / Euler의 수 (소수점 5 자리))를 입력 한 다음 해당 값을 "k"로 반환합니다. 또한 "n"은 나머지 배열의 최대 값입니다. 마지막으로 함수에서 반환 된 값은 "k"와 "n"을 모두 포함하는 배열의 최대 값입니다.

참고 : max()Python 의 기능 O (n) 복잡성입니다.

아래는 임의의 고유 한 10 개 항목 배열이 제공되는 코드를 읽을 수있는 비 코드 골프 버전 으로, 작동하는지 확인합니다.

import random, math

def Interview():
    k = max(h[0:int(len(h)/math.e)-1])
    n = max(h[int(len(h)/math.e)-1:len(h)-1])
    return max([k, n])

h = random.sample(range((2*31)-1), 10)

print(Interview(h))

PPCG에 오신 것을 환영합니다! 수입을 쉼표로 구분할 수 있습니다. 또한 배열을 직접 생성 할 필요가 없으므로 코드의 해당 부분을 제거 할 수 있습니다 (단순히 배열을 함수의 매개 변수로 사용)
Nathan Merrill

@NathanMerrill 그래, 그 일을 생각하고 있었지만, 당신이 정말로 그것을 좋아하지 않을 것이라고 생각했지만, 실제로는 중요하지 않다는 것을 알았으므로 대답을 편집 할 것입니다. 또한 수입품을 구분하는 쉼표에 대한 팁에 감사드립니다. 나는 그것에 대해 완전히 잊었다!
R. Kap

다른 팁 : 불필요한 공백이 많이 있습니다 (쉼표 뒤에 등호 사이에 있습니다. 끝 부분에도 인쇄 설명이 필요하지 않습니다.
Nathan Merrill

@NathanMerrill 팁 주셔서 감사합니다! 더 많은 코드 골프를 할 때 명심하십시오. :)
R. Kap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.