アルコール耐久力ゲーム - プログラミング問題解決

L1-019 先に倒れる者 (15点)拳遊びは古代中国の酒文化における興味深い要素の一つです。テーブルに座る二人が拳遊びを行う方法は、それぞれが口で一つの数字を叫び、同時に手で一つの数字を表現します。もし誰かが表現した数字が、二人が叫んだ数字の合計と等しければ、その人が負け、負けた人は一杯の酒を飲まされます。両者とも勝つか両者とも負ける場合は次のラウンドに続き、唯一の勝者が現れるまで続けられます。

以下に、甲と乙の二人の酒量(倒れるまでに飲める最大杯数)と拳遊びの記録が与えられるので、どちらが先に倒れるかを判断してください。

入力形式:

最初の行で、甲と乙の酒量(100以下の非負の整数)を順に与え、スペースで区切ります。次の行で正の整数N(≤100)を与え、その後にN行の拳遊びの記録を各行に以下の形式で与えます:

甲の叫び 甲の表現 乙の叫び 乙の表現

ここで叫びは叫んだ数字、表現は表現した数字であり、どちらも100以下の正の整数です(両手で一緒に表現します)。

出力形式:

最初の行で先に倒れた人を出力します:Aは甲を、Bは乙を表します。2行目で倒れなかった人が飲んだ杯数を出力します。問題保証により、必ず一人が倒れます。プログラムは誰かが倒れた時点で終了し、その後のデータは処理する必要ありません。

入力例:

1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16

出力例:

A
1

注意事項:

問題文を注意深く読んでください。つまり、誰が負けるかは叫んだ数字が甲乙双方の表現した数字の合計と等しい場合と判定されます。先に甲乙二人の酒量を入力し、飲んだ杯数が酒量を超えたら倒れるとします。その後、何回拳遊びを行うかを入力します。必ずしもすべての拳遊びを完了する必要はありません。

仮定として、甲の叫びをq、甲の表現をw、乙の叫びをe、乙の表現をrとします。q+e=wの場合、甲が飲みます。q+e=rの場合、乙が飲みます。またw=rの場合、必ず同敗または同勝で引き分けとなります。

以下にソースコードを示します(C++):

#include <iostream>
using namespace std;

int main()
{
    int sakeA, sakeB, sakeDrunkA, sakeDrunkB;
    int shoutA, gestureA, shoutB, gestureB;
    
    cin >> sakeA >> sakeB;
    sakeDrunkA = sakeDrunkB = 0;
    
    int rounds;
    cin >> rounds;
    
    for (int i = 0; i < rounds; i++)
    {
        cin >> shoutA >> gestureA >> shoutB >> gestureB;
        
        if (gestureA != gestureB)
        {
            if (shoutA + shoutB == gestureA) sakeDrunkA++;
            else if (shoutA + shoutB == gestureB) sakeDrunkB++;
        }
        
        if (sakeDrunkA > sakeA)
        {
            cout << "A" << endl;
            cout << sakeDrunkB;
            return 0;
        }
        
        if (sakeDrunkB > sakeB)
        {
            cout << "B" << endl;
            cout << sakeDrunkA;
            return 0;
        }
    }
    
    return 0;
}

タグ: プログラミング問題 C++ アルゴリズム 入出力処理 ループ制御

5月13日 01:14 投稿