解答-予想対戦表


対戦予定表
問題の説明
△△△ゲーム大会が行われた.今大会はN人が参加し、トーナメント形式で行われる.N人の参加者は1からNの順に割り当てられる.あと、1番、2番、3番、4番N-1番選手同士でゲームを行います.試合ごとに優勝した人は次のラウンドに入ることができます.このとき、次のラウンドに進んだ参加者番号は1番から順にN/2番に並びます.1番と2番の試合で2番が勝利すれば、次のラウンドで1番が与えられ、3番と4番の試合で3番が勝利すれば、次のラウンドで2番が与えられる.ゲームは最後の一人が残るまで行われます
1回戦ではAの参加者とBの参加者が何回戦で出会う.ゲーム参加者数N、参加者番号A、競合者番号Bを関数解のパラメータとした場合、第1ラウンドにA番を持つ参加者は、競合者と思われるB番の参加者と第数ラウンドで会ったときに返されるsolution関数を完了してください.しかし、A番とB番の出場者は終始リードしていた.
せいげんじょうけん
N:21以上220以下の自然数(2の指数に乗じて不戦勝は起こらない).
A,B:N以下の自然数(ただし,A≠B).
に答える
  • Nがありますが、果たしてNが必要ですか?
  • に勝った人は、次の番号が何試合目かに等しい.
  • parseInt( (n+1)/2)
  • が再び入り、2人の参加者が同じ試合に属していることを確認した瞬間、どうなりますか?
  • さいきかんすう
  • a,bの試合番号を確認します.
  • の場合、
  • を返します.
  • が違うと、再び角
  • をつなぎます
  • に入ってroundを設定し、入るたびにroundを追加します.
  • 最初の解釈
    function solution(n, a, b) {
      return rec(1, a, b)
    }
    
    function rec(round, a, b) {
      const am = getNext(a)
      const bm = getNext(b)
      if (am === bm) return round
      else return rec(round + 1, am, bm)
    }
    
    function getNext(n) {
      return parseInt((n + 1) / 2)
    }
    再帰関数を使用して解く
    改善
    他の解答を見て、改善点を発見しました.
  • の次の試合がparseInt((n + 1) / 2)のようにMath.ceil(n/2)の形で行われるよりも簡潔だ.
  • の再帰関数ではなく、簡単な複文を使用できます.
  • 改善された回答の適用
    function solution(n, a, b) {
      const f = (n) => Math.ceil(n / 2)
      let answer = 0
    
      while (a !== b) {
        a = f(a)
        b = f(b)
        answer++
      }
      return answer
    }
    不要な再帰関数を削除し、使用する関数を内部関数に変更します.