Moloco의 Vitcoin 추첨 (어려움)
시간 제한2초메모리 제한512 MB
각 티켓 i를 뽑으면 상금을 받고 확률 p_i로 계속, 1-p_i로 종료될 때, 기대 상금 합을 최대로 하는 순서를 구하고 동률이면 사전순으로 가장 앞선 순열을 출력한다.
문제
월말이 되면 Moloco 직원들은 사내 복지 혜택을 걸고 간단한 추첨을 한다.
당신은 Moloco의 소중한 직원이라 추첨권 장을 받았다. 추첨권 의 상금은 Vitcoin이다.
추첨권 에는 동전이 하나씩 짝지어져 있다. 이 동전은 확률 로 앞면이 나오고 확률 로 뒷면이 나온다 (). 모든 동전 던지기는 서로 독립이다.
각 단계에서 아직 고르지 않은 추첨권을 하나 골라 상금을 즉시 받는다. 그다음 그 추첨권과 짝지어진 동전을 던진다. 앞면이 나오면 추첨이 이어져서 다음 추첨권을 고를 수 있고, 추첨권이 떨어질 때까지 이 과정을 반복한다. 뒷면이 나오면 추첨은 그 자리에서 끝나고, 그때까지 모은 Vitcoin을 모두 가진다.
모든 와 를 알고 있다. 받는 Vitcoin의 기댓값을 최대로 만드는 추첨권 선택 순서를 구하라.
입력
첫째 줄에 정수 이 주어진다 ().
다음 개 줄에는 각각 두 정수 와 가 주어진다 (, ). 확률은 이다.
출력
추첨권을 고르는 순서를 나타내는 길이 의 순열을 한 줄에 공백으로 구분해 출력한다. 순열의 원소는 이상 이하의 정수다.
기댓값을 최대로 만드는 순열이 여러 개면 사전순으로 가장 앞서는 것을 출력한다.
힌트
순서 으로 고를 때 받는 Vitcoin의 기댓값은 이다.
첫 번째 예제에서 순서 의 기댓값은 이고, 기댓값이 가장 큰 순서는 을 주는 이다. 세 번째 예제에서는 순서 과 의 기댓값이 같지만 이 사전순으로 앞선다.