[プログラマー/JavaScript]入国審査


問題の説明📝


n人が並んで入国審査を待っています.入国審査台ごとに審査官が審査するのにかかる時間が異なります.
最初はすべての審査団が空いていました1つの審査台は同時に1人しか審査できない.一番前に立っている人は空いている審査台で審査を受けることができます.しかし、もっと早く終わった審査団があれば、そこで審査を受けるまで待つこともできます.
全員が審査を受けるのに要する時間を最小限に抑えたい.
各レビュー担当者に必要な時間の配列時間をパラメータとしてレビューするときに、すべての人がレビューを受け入れるのに要する時間の最大値を返す解決関数を書いてください.

せいげんじょうけん


入国審査待ち人数は1名以上10000000名以下.
各審査官が1人を審査するのに要する時間は1分以上10000000分以下である.
審査官は1名以上10万名以下です.

に答える


バイナリナビゲーションを使用する問題.
問題の例は次のとおりです.
最低1分から最大60分まで(6명 * times 배열의 최대 값)
1分と60分の中間値、30分30 / 7+30 / 10=7人で、6人を超えた.
1分と30分の中間値です.15分単位です.15 / 7+15 / 10=3人、6人未満.
中間値は16分と30分で23分単位です23 / 7+23 / 10=5人、6人未満.
24分と30分の中間値は、27分を基準としています27 / 7+27 / 10=5人、6人未満.
28分と30分の中間値は、29分を基準としています29 / 7+29 / 10=6名、正解と一致!
しかし、最小値を求める必要があるため、答えが正しいかどうかはまだ分からない.
28分と29分の中間値、28分ベース28 / 7+28 / 10=6名、正解と一致!
だから28分が正解
function solution(n, times) {
  let left = 1;
  let right = n * Math.max(...times);

  while (left < right) {
    const temp = Math.floor((left + right) / 2);

    const count = times.reduce((acc, time) => {
      return acc + Math.floor(temp / time);
    }, 0);

    if (count >= n) {
      right = temp;
    } else {
      left = temp + 1;
    }
  }

  return right;
}