C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++プログラム:通信遅延を考慮したタイピングゲームの勝者を判定する方法

5つの整数 sv1v2t1t2 が与えられます。Amal(アマル)とBimal(ビマル)は、オンラインでタイピングゲームの対戦を行っています。このゲームでは、長さ s の文字列を入力します。Amalが1文字入力するのにかかる時間は v1 ミリ秒、Bimalは v2 ミリ秒です。また、Amalのネットワーク遅延は t1 ミリ秒、Bimalのネットワーク遅延は t2 ミリ秒です。

通信遅延がある場合のゲームの流れ

通信遅延が t ミリ秒であるとき、各参加者にとって競技は次のように進行します。

  • ゲーム開始からちょうど t ミリ秒後に入力すべきテキストが届く。
  • テキストを受け取った直後に入力を開始する。
  • すべてのテキストの入力を完了してからちょうど t ミリ秒後に、サイトへその情報が送信される。

より早く完了した方が勝者となり、両者の所要時間が同じであれば引き分けとなります。この勝者を求めるのが今回の課題です。

入力例と出力例

例えば、s = 5v1 = 1v2 = 2t1 = 1t2 = 2 が入力として与えられた場合、出力は Amal になります。Amalの結果がサイトに届くのは7ミリ秒後であるのに対し、Bimalは14ミリ秒後だからです。したがって、Amalの勝利となります。

解法の考え方

この問題は非常にシンプルで、各参加者の合計所要時間を計算して比較するだけです。合計所要時間は次の式で求められます。

合計時間 = 文字列の長さ × 1文字あたりの入力時間 + 2 × 通信遅延

通信遅延は「テキスト受信時」と「結果送信時」の2回発生するため、2倍する必要がある点に注意しましょう。

アルゴリズムの手順

以下の手順で問題を解くことができます。

p := (s * v1) + (2 * t1)
q := (s * v2) + (2 * t2)
if p == q then:
    return "Draw"(引き分け)
else if p < q then:
    return "Amal"
else:
    return "Bimal"

C++による実装例

理解を深めるために、以下の実装例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

string solve(int s, int v1, int v2, int t1, int t2) {
    int p = (s * v1) + (2 * t1);
    int q = (s * v2) + (2 * t2);
    if (p == q)
        return "Draw";
    else if (p < q)
        return "Amal";
    else
        return "Bimal";
}

int main() {
    int s = 5;
    int v1 = 1;
    int v2 = 2;
    int t1 = 1;
    int t2 = 2;
    cout << solve(s, v1, v2, t1, t2) << endl;
}

入力

5, 1, 2, 1, 2

出力

Amal

計算量

このアルゴリズムは定数回の演算のみで構成されているため、時間計算量は O(1)、空間計算量も O(1) です。入力サイズに依存しないため、非常に効率的な解法と言えます。

  1. C++で数列3、5、33、35、53…のN番目の項を求めるプログラム

    はじめにこのチュートリアルでは、数列「3、5、33、35、53…」のN番目の項を求めるC++プログラムについて解説します。この問題では、ある整数nが与えられます。私たちのタスクは、その数列におけるn番目の項を特定することです。数列の規則性まず、この数列がどのように構成されているのかを見てみましょう。1番目の項:32番目の項:53番目の項:33(1番目の項に「3」を付加)4番目の項:35(1番目の項に「5」を付加)5番目の項:53(2番目の項に「3」を付加)6番目の項:55(2番目の項に「5」を付加)つまり、奇数番目の項は「i/2 番目の項の末尾に3を付けた数」、偶数番目の項は「(i/2 − 1

  2. C++でグラフ行列の逆行列を求めるプログラムの実装方法

    本記事では、グラフ行列の逆行列を求めるC++プログラムについて詳しく解説します。行列の逆行列は、対象となる行列が正則(非特異)である場合、すなわち行列式が0ではない場合にのみ存在します。 逆行列を求める手法は複数ありますが、ここでは随伴行列(余因子行列の転置)と行列式を組み合わせて逆行列を計算する方法を紹介します。 アルゴリズムの手順 逆行列を求める際の処理の流れは以下の通りです。 開始 行列の逆行列を求める関数 INV() を定義する。 行列式を計算する関数 DET() を呼び出す。 随伴行列を生成する関数 ADJ() を呼び出す。 次の公式に基づいて逆行