試合中のペアリング回数の問題について述べる
5747 ワード
試合中のペアリング回数
質問:試合中のチーム数を表す整数nをあげます.試合は独特の試合制に従っている.
現在のチーム数が偶数であれば、各チームは別のチームとペアを組む.全部でn/2試合が行われ、n/2チームが次のラウンドに進出する.現在のチーム数が奇数であれば、ランダムにラウンドして1つのチームに昇格し、残りのチームがペアになります.合計(n-1)/2試合が行われ、(n-1)/2+1チームが次のラウンドに進出する.優勝チームが決まるまで試合で行われたペアリングの回数を返す.
構想:例:入力:n=7出力:6解釈:試合詳細:第1ラウンド:チーム数=7、ペアリング回数=3、4チームが昇格. 第2ラウンド:チーム数=4、ペアリング回数=2、2チーム昇格. 第3ラウンド:チーム数=2、ペアリング回数=1で優勝チームを1本決める.合計ペアリング数=3+2+1=6 入力:n=14出力:13解釈:試合詳細:第1ラウンド:チーム数=14、ペア数=7、7チーム昇格. 第2ラウンド:チーム数=7、ペアリング回数=3、4チームが昇格. 第3ラウンド:チーム数=4、ペアリング回数=2、2チーム昇格. 第4ラウンド:チーム数=2、ペアリング回数=1で優勝チームを1本決める.合計ペアリング数=7+3+2+1=13 方法1:テーマの要求に従って反復して和を求める
方法2:再帰
方法3:発見を通じて、私たちのペアリング回数は常にチーム数の1を減らすことに等しい.
質問:試合中のチーム数を表す整数nをあげます.試合は独特の試合制に従っている.
現在のチーム数が偶数であれば、各チームは別のチームとペアを組む.全部でn/2試合が行われ、n/2チームが次のラウンドに進出する.現在のチーム数が奇数であれば、ランダムにラウンドして1つのチームに昇格し、残りのチームがペアになります.合計(n-1)/2試合が行われ、(n-1)/2+1チームが次のラウンドに進出する.優勝チームが決まるまで試合で行われたペアリングの回数を返す.
構想:例:入力:n=7出力:6解釈:試合詳細:
class Solution {
public:
int numberOfMatches(int& n) const {
if(n <= 1) return 0;
auto count = 0;
while(n > 1) {
count += n / 2;
n = n & 1 ? (n + 1) / 2 : n / 2;
}
return count;
}
};
方法2:再帰
class Solution {
public:
int numberOfMatches(int n) const {
if(n <= 1) return 0;
return n / 2 + numberOfMatches((n + 1) / 2);
}
};
方法3:発見を通じて、私たちのペアリング回数は常にチーム数の1を減らすことに等しい.
class Solution {
public:
int numberOfMatches(int n) {
if(n <= 1) return 0;
return n - 1;
}
};