만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

모두 살아남았는가?

시간 제한8초메모리 제한1024 MB

요약
각 플레이어의 소속 팀과 명중 확률이 주어질 때, 공격 대상을 최적으로 골라 아군 전원이 살아남을 확률을 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 확률, 게임 이론
정답자
아직 제출이 없습니다

문제

당신은 친구들과 1인칭 슈팅 게임을 하고 있다. 이 게임에서는 nn명의 플레이어가 두 팀으로 나뉘어 서로 싸운다. 각 플레이어는 머리 위에 풍선을 달고 있으며, 플레이어들은 상대 팀 플레이어의 풍선을 터뜨리려고 한다.

플레이어에게는 1부터 nn까지 번호가 붙는다. 이 번호를 행동 순서라고 한다. 각 플레이어에게는 명중 확률이라는 실수도 주어진다. 게임은 nn개의 단계로 진행된다. ii번째(i=1,…,ni = 1, \dots, n) 단계에서는 행동 순서가 ii인 플레이어(공격자)가 다음 행동을 한다.

  • 공격자의 풍선이 이미 터졌다면 공격자는 사망 상태이며, 이 단계는 아무 행동 없이 넘어간다.
  • 상대 팀 플레이어가 모두 사망했다면 이 단계도 넘어간다.
  • 그 밖의 경우에는 살아 있는 상대 팀 플레이어 중 한 명을 공격 대상으로 고른다. 대상은 이전 행동의 결과에 따라 고를 수 있다. 공격은 대상과 관계없이 공격자의 명중 확률에 따라 성공한다. 공격이 성공하면 대상의 풍선이 터지고 대상은 사망한다.

모든 단계가 끝나면 게임이 끝난다.

당신은 자기 팀 플레이어가 한 명도 죽지 않기를 바란다. 공격 대상을 최적으로 골랐을 때, 게임이 끝날 때까지 자기 팀 플레이어 전원이 살아남을 확률을 구하라. 상대 팀 플레이어는 공격 대상을 무작위로 고른다고 가정한다.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 데이터셋의 수는 50을 넘지 않는다. 각 데이터셋은 다음 형식으로 주어진다.

nn s1s_1 p1p_1 ⋮\vdots sns_n pnp_n

nn은 플레이어의 수이며 2 이상 300 이하의 정수이다. 각 i=1,…,ni = 1, \dots, n에 대해 sis_i는 "Ally" 또는 "Enemy"이며, 행동 순서가 ii인 플레이어가 자기 팀이면 Ally, 상대 팀이면 Enemy이다. pip_i는 명중 확률이며 0 이상 1 이하의 실수이고 소수점 아래 9자리로 주어진다. 두 팀에는 각각 적어도 한 명의 플레이어가 있다.

입력의 끝은 0이 적힌 한 줄로 표시된다.

출력

각 데이터셋에 대해, 공격 대상을 최적으로 골랐을 때 자기 팀 플레이어 전원이 살아남을 확률을 한 줄에 출력한다. 절대 오차 또는 상대 오차가 10−910^{-9} 이하이면 정답으로 인정한다.

예제1

  1. 예제 1

    입력
    3
    Ally 0.800000000
    Enemy 0.300000000
    Enemy 0.600000000
    2
    Enemy 0.444444444
    Ally 0.111111111
    5
    Ally 0.500000000
    Ally 0.750000000
    Enemy 0.400000000
    Enemy 0.100000000
    Enemy 0.800000000
    6
    Ally 0.250000000
    Ally 0.300000000
    Enemy 0.200000000
    Ally 0.800000000
    Enemy 1.000000000
    Enemy 0.750000000
    10
    Enemy 0.032876598
    Ally 0.273941411
    Ally 0.560821701
    Ally 0.798896750
    Enemy 0.559524781
    Enemy 0.627232231
    Enemy 0.864686751
    Ally 0.991458997
    Enemy 0.699768375
    Enemy 0.675523871
    0
    
    예상 출력
    0.616000000000
    0.555555556000
    0.621000000000
    0.419750000000
    0.142319776535