解いた問題

7/18/2011

SRM460 Div1 Easy

250
各問題にYesがNoを割り当てて、どの答えがどの質問に対する答えなのかを全部調べてたら終わらないと思って、頑張って計算する問題だと思った。もちろん、そんなことはなかった。
挙句、解説を見て解いた。意外と単純な回答だった。悲しい。
質問を "Yes" か "No" か "2回目以降の出題" に割り当てながら数える。
int rec(int idx, vector<string> a, int yes, int no, int unkwon)
{
  if( idx == a.size() ) return !unkwon;

  int sum = 0;
  if( unkwon ){
    if( a[idx][0] == 'Y' ){
      sum += unkwon * rec(idx+1, a, yes+1, no, unkwon-1 );
    }
    else{
      sum += unkwon * rec(idx+1, a, yes, no+1, unkwon-1 );
    }
  }

  if( a[idx][0] == 'Y' && yes ){
    sum += yes * rec(idx+1, a, yes, no, unkwon);
  }
  if( a[idx][0] == 'N' && no ){
    sum += no * rec(idx+1, a, yes, no, unkwon);
  }

  return sum;
}

class TheQuestionsAndAnswersDivOne {
public:
  int find(int q, vector <string> a) {

    return rec( 0, a, 0, 0, q );
  }
};

0 件のコメント :

コメントを投稿