버그 수정하기

면접 대비

시간 제한1초메모리 제한128 MB

요약
버그 B개, 남은 시간 T, 실패 시 확률 감소 계수 f가 주어질 때, 매 시간 작업할 버그를 골라 고친 버그 심각도 합의 기댓값을 최대로 만드는 값을 구한다.
난이도

보통10점 중 7점

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

문제

한 대형 소프트웨어 회사가 주력 제품의 새 버전 출시를 준비하고 있다. 이 프로젝트에 새로 합류한 개발자인 당신은, 새 버전이 나가기 전에 고쳐야 할 미해결 버그 목록을 받았다.

버그이다 보니 몇 가지 아이디어는 있어도 정확히 어떻게 고칠지는 확실하지 않다. 각 버그에 대해 당신은 그 버그를 빠르게 고칠 수 있을 확률을 추정할 수 있다. 이 추정은 틀릴 수 있어서, 어떤 버그를 시도했다가 실패하면 그 버그에 대한 추정치를 낮추게 된다.

이 과정을 다음과 같은 확률 모형으로 표현한다. 각 버그에는 현재 수정 확률 pp가 있다. 매 시간마다 당신은 미해결 버그 하나를 골라 그 한 시간 동안 그 버그에 매달린다(한 시간이 되기 전에 고치면 남은 시간은 쉬며 보낸다). 그 시간 안에 버그를 고칠 확률은 pp이다. 실패하면 그 버그의 수정 확률에 계수 ff(0≤f≤10 \le f \le 1)가 곱해져 p⋅fp \cdot f가 되고, 다른 버그들의 수정 확률은 그대로 유지된다. 다음 시간에도 다시 미해결 버그 하나를 골라 작업하며, 새 버전이 출시될 때까지 이를 반복한다.

각 버그에는 그것을 고치는 것이 얼마나 가치 있는지를 나타내는 심각도 ss도 있다. 출시 전에 모든 버그를 다 고치지 못할 수도 있으므로, 상사에게 최대한 좋은 인상을 주기 위해 당신은 매 시간 작업할 버그를 신중히 골라 고쳐낸 버그들의 심각도 합을 최대화하려 한다. 매 시간 이 값을 최대화하도록 작업할 버그를 고른다고 할 때, 당신이 고치는 버그들의 심각도 합의 기댓값은 얼마인가?

입력

첫 줄에는 세 수 BB, TT, ff가 주어진다.

  • 정수 BB (0≤B≤100 \le B \le 10): 미해결 버그의 수,
  • 정수 TT (0≤T≤1000 \le T \le 100): 출시까지 남은 시간(시간 단위),
  • 실수 ff (0≤f≤10 \le f \le 1): 위에서 설명한 계수.

이어지는 BB개의 줄에는 각 버그가 두 수 pp와 ss로 주어진다. 실수 pp (0≤p≤10 \le p \le 1)는 그 버그의 초기 수정 확률이고, 정수 ss (0≤s≤100000 \le s \le 10000)는 그 버그의 심각도이다.

출력

당신이 고치는 버그들의 심각도 합의 기댓값을, 이 값을 최대화하도록 작업했을 때의 최댓값으로 소수점 아래 여섯 자리까지 반올림하여 출력한다.

예제4

  1. 예제 1

    입력
    1 2 0.950000
    0.700000 50
    
    예상 출력
    44.975000
    
  2. 예제 2

    입력
    2 2 0.500000
    0.750000 100
    0.750000 20
    
    예상 출력
    95.625000
    
  3. 예제 3

    입력
    1 3 1.000000
    0.500000 100
    
    예상 출력
    87.500000
    
  4. 예제 4

    입력
    1 1 0.500000
    1.000000 100
    
    예상 출력
    100.000000