The Sekretaris Masalah adalah masalah terkenal digambarkan sebagai demikian:
- Anda membutuhkan sekretaris baru
- Anda memiliki N pelamar yang dapat Anda wawancarai satu per satu
- Anda dapat menilai setiap pelamar setelah wawancara. Sistem penilaian Anda tidak akan pernah memberi dua pelamar skor yang sama
- Setelah Anda mewawancarai pelamar, Anda harus memberikan "ya" atau "tidak" langsung
- Anda ingin pelamar dengan skor tertinggi
Solusinya adalah dengan mewawancarai floor(N/e)
pelamar pertama , dan kemudian menerima pelamar pertama yang memiliki skor lebih tinggi dari semua pelamar sebelumnya. Jika tidak ada pelamar yang lebih tinggi, kembalikan pelamar terakhir. Cukup menarik, ini memberi pelamar 1/e
persen atas waktu. e
mengacu pada nomor Euler . Untuk mendapatkan nilai e
, Anda dapat menggunakan builtin,log
,, atau hardcode ke setidaknya 5 poin desimal.
Memasukkan:
Susunan bilangan bulat unik non-kosong tidak lebih dari 2^31-1
.
Keluaran:
Integer yang mewakili kandidat yang dipilih. Agar jelas algoritmanya adalah:
- Temukan elemen maksimum di yang pertama
floor(N/e)
array. - Iterasi melalui elemen yang tersisa, dan kembalikan elemen pertama yang lebih tinggi dari maksimum yang ditemukan pada langkah 1.
- Jika tidak ada elemen yang lebih tinggi, maka kembalikan elemen terakhir.
Sebagai contoh, katakan array Anda tadinya [2,7,4,3,9,20]
, begitu N = 6
dan floor(N/e) = 2
. 2 elemen pertama dari array adalah [2,7]
. Maks [2,7]
adalah 7
. Elemen yang tersisa adalah [4,3,9,20]
. Elemen pertama yang lebih besar dari 7
itu 9
, jadi kami kembali 9
.
Kasus uji:
[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
Solusi Anda harus O(n)
, di mana n
panjang array. Jika bahasa Anda memiliki builtin yang menemukan maksimum array, Anda dapat mengasumsikan bahwa fungsi tersebut diperlukanO(n)
(dan mudah-mudahan itu terjadi).
Celah standar berlaku, dan ini adalah kode-golf , jadi buatlah jawaban tersingkat dalam bahasa favorit Anda!
sumber
e
harus digunakan?e
(misalnya Python, di manae=2.71828
lebih pendek dariimport math;math.E
)Jawaban:
Jelly, 13 byte
Jelas suatu algoritma O (n) , semoga implementasi O (n) . Cobalah online!
Bagaimana itu bekerja
sumber
CJam, 20 Bytes
Bekerja mirip dengan saran Dennis.
sumber
$W=
tidak berjalan dalam waktu linier.:e>
(kurangi secara maksimum)Java,
128118 byteBertakuk:
sumber
MATL ,
272523 byteMenggunakan pendekatan yang sama dengan jawaban CJam A. Simmons .
Cobalah online!
sumber
JavaScript (ES6) 64
Kurang golf
Uji
sumber
Ruby, 64 byte
sumber
a.find
pada langkah kedua, meskipun jelas itu jauh lebih efisien.(0...c)
rentang yang tidak termasuk c.PARI / GP , 70 byte
Ini mungkin mengalami masalah pada versi gp yang lebih lama ketika diberikan singleton, tetapi ia bekerja setidaknya dari revisi 18487.
sumber
JavaScript (ES6), 79 byte
Bekerja karena
findIndex
mengembalikan-1
pada kegagalan, tetapia.slice(-1)[0]
mengembalikan elemen terakhir dari array seperti yang diinginkan.sumber
Python 2, 87 byte
Pengguna memasukkan array sebagai daftar, dengan tanda kurung dan koma.
input()
Perintah Python 2 nyaman di sini.Terlepas dari apakah kami menghentikan proses lebih awal, kami mempekerjakan orang terakhir yang diwawancarai.
sumber
Perl 6, 43 byte
Saya pikir ini O (n)
sumber
Python 3.5; 110 byte:
Pada dasarnya, apa yang dilakukan di atas adalah bahwa ia pertama-tama membutuhkan array yang disediakan, "h" selama itu mencakup lebih dari 5 item (untuk saat ini ...), menemukan nilai maksimum dalam yang pertama (panjang array (len (h )) / Nomor Euler (ke 5 tempat desimal)) item dari array itu, dan kemudian mengembalikan nilai itu sebagai "k". Selain itu, "n" adalah nilai maksimum di seluruh array. Akhirnya, nilai yang dikembalikan dari fungsi adalah nilai maksimum dalam array yang mengandung "k" dan "n".
Catatan:
max()
Fungsi Python adalah O (n) kompleksitas.Di bawah ini adalah lebih mudah dibaca, non-kode-golf versi kode di atas yang yang memiliki larik 10-item acak yang disediakan, untuk mengonfirmasi bahwa ia berfungsi:
sumber