解いた問題のソースコードと解説など。


POJ 3869 Headshot

問題

リボルバー式の拳銃があり、シリンダー内の弾の装填の情報が与えられる。ロシアンルーレットで遊ぶとして、どの薬室からスタートしたかわからないが相手の手番では発砲しなかった。次の番はあなたで、そのまま打つか、シリンダーをランダムに回転させてから打つか選ぶことができる。どちらが発砲しない可能性が高いか答えよ。

やりかた

やるだけ
打つ前にランダムに回転させると、発砲しない確率は(0の数)/(薬室の数)になる。一方そのまま打つ場合では、相手が打ったあとなので銃身の薬室はこの時点で0という状況下である。その次の薬室が1なら発砲してしまうし、0なら発砲しない。なので発砲しない確率は(00という並びの個数/0の個数)になる。この大小を比べる。

以下ソース。

int main(int argc, char **argv){
  string s;
  while(cin >> s){
    int zero = count(ALL(s), '0');
    
    int condition = 0, situation = 0;
    for(int i = 0; i < s.size(); i++){
      if(s[i] == '0'){
	condition++;
	if(s[(i + 1) % s.size()] == '0') situation++;
      }
    }
    if(zero * condition > situation * s.size()) 
      cout << "ROTATE" << endl;
    else if(zero * condition < situation * s.size())
      cout << "SHOOT" << endl;
    else
      cout << "EQUAL" << endl;
  }
  return 0;
}
しょげないでよBaby 眠れば治る