バドミントン
2008.09.13 21:59 パソコン甲子園 2008
問題 パソコン甲子園2008予選 02
A君とBさんが以下のルールでバドミントンをしました。
(1データセットにつき)3ゲームを行います。
各ゲームは11点先取した人が勝者となります。
第1ゲームの最初のサーブはA君から始まりますが、次のサーブは直前のポイントを取った人が行います。
第2ゲーム、第3ゲームは前のゲームを取った人が最初のサーブを行います。
10-10になって以降は2点差をつけた人が勝者となります。
誰がサーブを打ったかの情報のみから2人の得点を求めて下さい。
入力例
ABAABBBAABABAAABBAA
AABBBABBABBAAABABABAAB
BABAABAABABABBAAAB
AABABAAABBAABBBABAA
AAAAAAAAAAA
ABBBBBBBBBB
0(入力の終り)
出力例
11 8
10 12
11 7
11 8
11 0
0 11
A君とBさんが以下のルールでバドミントンをしました。
(1データセットにつき)3ゲームを行います。
各ゲームは11点先取した人が勝者となります。
第1ゲームの最初のサーブはA君から始まりますが、次のサーブは直前のポイントを取った人が行います。
第2ゲーム、第3ゲームは前のゲームを取った人が最初のサーブを行います。
10-10になって以降は2点差をつけた人が勝者となります。
誰がサーブを打ったかの情報のみから2人の得点を求めて下さい。
入力例
ABAABBBAABABAAABBAA
AABBBABBABBAAABABABAAB
BABAABAABABABBAAAB
AABABAAABBAABBBABAA
AAAAAAAAAAA
ABBBBBBBBBB
0(入力の終り)
出力例
11 8
10 12
11 7
11 8
11 0
0 11
解説
ロジックを組むのがなかなか面倒そうな問題、、と思ったらすごく簡単です。
ポイントは、1ゲームの情報(各行)からそのゲームの得点が決まるということです。
(問題文にある、前のゲームを取った人が最初のサーブを行うというルールは
問題を解くうえでは必要ない情報)
各ゲーム(行)について、まず、1文字目を除いたAとBの数を求めます。
これで、各ゲームの最後のポイントを除いたA君とBさんの得点が求まります。
次に、この2つの得点から以下のアルゴリズムで誰が最後のポイントを獲得
したかを推測し、最終得点を決めます。
A > B ならば A に 1 を足し、
A < B ならば B に 1 を足します。
(入力は正しく行われたゲームの情報なのでこのアルゴリズムが適用できます)
サンプルプログラム
001 #include<iostream>
002 #include<cassert>
003 using namespace std;
004
005 void play(string game){
006 int A, B;
007 A = B = 0;
008 for ( int i = 1; i < game.size(); i++ ) {
009 if ( game[i] == 'A' ) A++;
010 else B++;
011 }
012 if ( A > B ) A++;
013 else if ( A < B ) B++;
014 else assert( false );
015
016 cout << A << " " << B << endl;
017 }
018
019 int main(){
020 string game;
021 while( cin >> game && game != "0") play(game);
022 return 0;
023 }
スポンサーサイト
| コメント(0) | トラックバック(0) | ↑ページトップ |