fc2ブログ



バドミントン

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

解説

ロジックを組むのがなかなか面倒そうな問題、、と思ったらすごく簡単です。
ポイントは、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) | ↑ページトップ |

この記事へのコメント

コメントを書く


管理人にのみ表示

↑ページトップ

この記事へのトラックバック

この記事にトラックバックする(FC2ブログユーザー)

↑ページトップ