সেক্রেটারির সমস্যা সমাধান করুন


13

সম্পাদক সমস্যা এইভাবে হিসাবে বর্ণনা একটি বিখ্যাত সমস্যা হল:

  1. আপনার নতুন সেক্রেটারি দরকার
  2. আপনার কাছে এন আবেদনকারী রয়েছে যে আপনি একবারে একটি করে সাক্ষাত্কার নিতে পারেন
  3. আপনি সাক্ষাত্কারের পরে প্রতিটি আবেদনকারীকে স্কোর করতে সক্ষম। আপনার স্কোরিং সিস্টেম কখনই দু'জন আবেদনকারীকে একই স্কোর দেয় না
  4. আপনি কোনও আবেদনকারীর সাক্ষাত্কার নেওয়ার পরে আপনাকে অবশ্যই অবিলম্বে "হ্যাঁ" বা "না" দিতে হবে
  5. আপনি সর্বোচ্চ স্কোর সহ আবেদনকারীকে চান

সমাধানটি হ'ল প্রথম floor(N/e)আবেদনকারীদের সাক্ষাত্কার দেওয়া এবং তারপরে প্রথম আবেদনকারীকে গ্রহণ করা যা পূর্ববর্তী সকল আবেদনকারীর তুলনায় উচ্চতর স্কোর। যদি আবেদনকারীর মধ্যে কেউ উচ্চতর না হন তবে সর্বশেষ আবেদনকারীকে ফিরিয়ে দিন। আকর্ষণীয় যথেষ্ট, এটি সময়ের সর্বোচ্চ আবেদনকারীকে 1/eশতাংশ দেয় । ইউলারের সংখ্যাe বোঝায় । এর মান পেতে , আপনি একটি বিল্টিন ব্যবহার করতে পারেন , বা হার্ডকোডটি কমপক্ষে 5 দশমিক পয়েন্টে রাখতে পারেন।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 আমি অনুমান করি এটি এন.ইউইকিপিডিয়া.org/wiki/E_(mathematical_constant )
ডুরকনব

1
আহ, এখন আমি বুঝতে পারি কীভাবে অ্যালগরিদম কাজ করে। আমি ভেবেছিলাম আপনার দ্বিতীয় অনুচ্ছেদের অর্থ হ'ল আপনি মেঝে (n / e) এর পরে প্রার্থীদের কোনও দিন সাক্ষাত্কার করবেন না।
ডোরকনবব

1
আমি বিশেষভাবে জিজ্ঞাসা করেছি কারণ কিছু ভাষায়, বিল্টিনটি ব্যবহার করার চেয়ে 5 দশমিক পয়েন্টের সাথে নির্ভুলতার সাথে একটি ভেরিয়েবলের সংজ্ঞা দেওয়া কম e(উদাহরণস্বরূপ পাইথন, যেখানে e=2.71828সংক্ষিপ্ততর হয় import math;math.E)
মেগো

1
দ্রষ্টব্য: of 1 / e শতাংশ সময় `সত্যই খারাপ হবে। এটি 1 / e এর সম্ভাব্যতা, এটি প্রায় 37% বার
edc65

উত্তর:


4

জেলি, 13 বাইট

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

অবশ্যই একটি হে (এন) অ্যালগরিদম, আশা করি একটি হে (এন) বাস্তবায়ন। এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

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

সিজেম, 20 বাইট

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

ডেনিসের পরামর্শ মত একই কাজ করে।

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=রৈখিক সময়ে চালায় না
ডেনিস

উরগ, আপনি ঠিক বলেছেন। আপনি জানেন যে সিজেমে সর্বাধিক সন্ধানের আরও ভাল কোনও উপায় আছে কি?
একটি সিমন্স

1
:e>(সর্বাধিক হ্রাস করুন)
ডেনিস

@ ডেনিস ধন্যবাদ!
এ সিমন্স

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
@ ডুরকনব এটি সর্বাধিক সন্ধানের জন্য প্রথম তল (এন / ই) উপাদানগুলির মধ্য দিয়ে লুপ করে, তারপরে প্রতিটি উপাদানের সর্বাধিকের সাথে তুলনা করে সবচেয়ে খারাপ অবস্থার মধ্যে বাকী তালিকার মধ্য দিয়ে যায়। উভয় অংশে উপাদান প্রতি এক তুলনা হয়।
আফসোস

আহ, ঠিক আছে। আমি ভুলভাবে পড়েছি এবং ভেবেছিলাম আপনি প্রতিটি পুনরাবৃত্তিতে সর্বাধিক সন্ধান করছেন।
ডুরকনব

1
আসলে, আমি মনে করি এটি এখনও ও (এন) যদি আপনি কেবল a.findদ্বিতীয় ধাপে করেন তবে স্পষ্টতই এটি অনেক কম দক্ষ।
হিস্টোক্র্যাট

1
আপনি (0...c)গ এর সাথে বাদ দিয়ে এমন একটি ব্যাপ্তির জন্য ব্যবহার করতে পারেন ।
হিস্টোক্র্যাট

@ ইতিহাসবিদ হ্যাঁ, এটি ও (2 এন) হওয়া উচিত যা ও (এন)
চার্লস

1

প্যারি / জিপি , 70 বাইট

সিঙ্গেলটন দেওয়ার সময় এটি জিপি-র পুরানো সংস্করণগুলিতে সমস্যা হতে পারে, তবে এটি কমপক্ষে 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 বাইট

আমি মনে করি এটি ও (এন)

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

1

অজগর 3.5; ১১০ বাইট:

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 টিরও বেশি আইটেম অন্তর্ভুক্ত থাকে (বর্তমানে ...) প্রথমটিতে সর্বাধিক মান সন্ধান করে (অ্যারের দৈর্ঘ্য (লেন (এইচ) )) / ইউরারের সংখ্যা (5 দশমিক স্থানে) that অ্যারের আইটেমগুলি এবং তারপরে সেই মানটি "কে" হিসাবে ফেরত দেয়। তদ্ব্যতীত, "এন" বাকি অ্যারের সর্বাধিক মান। অবশেষে, ফাংশন থেকে প্রত্যাবর্তিত মান হ'ল "কে" এবং "এন" উভয় সমন্বিত একটি অ্যারের সর্বাধিক মান।

দ্রষ্টব্য: max()পাইথনের কার্যকারিতা হ'ল ও (এন) জটিলতা।

নীচেরটিতে উপরের কোডটির আরও পাঠযোগ্য, নন-কোড-গল্ফ সংস্করণ রয়েছে যা এলোমেলো, অনন্য 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))

পিপিসিজিতে আপনাকে স্বাগতম! আপনি কমা আপনার আমদানি পৃথক করতে পারেন। এছাড়াও, আপনাকে নিজে অ্যারে তৈরি করার দরকার নেই, তাই আপনি কোডের সেই অংশটি সরিয়ে ফেলতে পারেন (কেবলমাত্র ফাংশনটির প্যারামিটার হিসাবে অ্যারেটি রাখতে পারেন)
নাথান মেরিল

@ নাথানম্যারিল হ্যাঁ, আমি এটি করার কথা ভাবছিলাম, তবে তখন আমি ভেবেছিলাম যে আপনি এটি সত্যিই পছন্দ করবেন না তবে এখন আমি জানি যে সত্যিই কিছু যায় আসে না, আমি আমার উত্তরটি সম্পাদনা করব। এছাড়াও, আমদানি পৃথক করে কমা সম্পর্কে টিপসের জন্য ধন্যবাদ। আমি পুরোপুরি ভুলে গিয়েছিলাম যে সম্পর্কে!
আর কাপ,

অন্যান্য, টিপস: আপনি সমান চিহ্ন মধ্যে, (অপ্রয়োজনীয় হোয়াইটস্পেস প্রচুর কমা পরে আছে হয় আপনি শেষে একটি মুদ্রণ বিবৃতি প্রয়োজন হবে
নাথন মেরিল

@ নাথানমারিল টিপসটির জন্য ধন্যবাদ! আমি আরও কোড-গল্ফ করার সময় তাদের মনে রাখব! :)
আর কাপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.