2011年9月11日日曜日

TopCoder SRM241 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。

ブラックジャックでは、プレーヤーはディーラーよりも数字が大きいか、もしくはディーラーがバースト(21を超える)し、プレーヤーが21を超えない場合、掛け金と合わせて、同じ額を余分に受け取ることができる。もし、プレーヤーが21以下で、ディーラーと同じ数になったらプッシュという状態になり。掛け金はそのままになる(プラスマイナス0の状態)。もしプレーヤーがディーラーの数より小さいか、21を超えてしまった場合、掛け金を失う。

ブラックジャックというのは21ポイントの状態で、すべての手を負かす。この場合、プレーヤーは掛け金の1.5倍を得ることができる。もし、プレーヤーもディーラーもブラックジャックであれば、プッシュになる。もし、ディーラーがブラックジャックで、プレーヤーがブラックジャックでないものの21であった場合は、ディーラーの勝ちで、プレーヤーは掛け金を失う。

プレーヤーの掛け金betと、ディーラーのスコアdealer、プレーヤーのスコアplayerと、2人がブラックジャックかそうでないかを表す状態(dealerBlackjack、blackjack)が与えられている。ブラックジャックである状態は1、そうでない状態は0で表す。このとき、プレーヤがの収支を返せ。勝てばプラス、負ければマイナス、プッシュは0になる。

私の解答はこちら。

public class BlackjackWinner {
 public int winnings(int bet, int dealer, int dealerBlackjack, int player, int blackjack) {
  if( dealerBlackjack == 0 && blackjack == 1){
   // プレーヤーのみブラックジャック
   return (int)(bet*1.5); // 掛け金は常に偶数
  }else if( dealerBlackjack == 1 && blackjack == 1){
   return 0; // 両者ブラックジャック(プッシュになる)
  }else if( dealerBlackjack == 1 && blackjack == 0 ){
   return -bet; // ディーラーのみブラックジャック
  }else{
   // どちらもブラックジャックではない
   if( player > 21 ){ // プレーヤーがバースト
    return -bet;
   }else if( player <= 21 && dealer > 21 ){
    return bet; // ディーラーがバースト
   }else if( player <= 21 && dealer <= 21 ){
    // どちらもバーストしてない
    if( player > dealer  ) return bet;
    if( player == dealer ) return 0;
    if( player < dealer  ) return -bet;
   }
  }
  return 0;
 }
}

得点は183.25/250。場合分けが細かいですね。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計