Knockout
시간 제한2초메모리 제한512 MB
남은 숫자와 주사위 합이 주어질 때, 합과 같은 부분집합을 골라 남은 숫자로 만드는 최종 수의 기대값을 최소화하거나 최대화합니다.
문제
솔리테어 게임 Knockout은 다음과 같이 진행된다. 숫자 1부터 9까지를 오름차순으로 적는다. 각 턴마다 육면체 주사위 두 개를 굴려서 눈의 합을 구하고, 그 합과 같은 합이 되는 숫자들의 집합을 원하는 대로 골라 지운다. 만약 지울 수 없다면 게임이 끝나고, 남은 숫자들을 하나의 수로 읽은 것이 점수가 된다. 지울 수 있다면 주사위를 다시 굴려 게임을 계속한다.
이 게임은 점수를 최소화하거나 최대화하는 방식으로 플레이할 수 있다. 게임의 상태(남아 있는 숫자)와 주사위 눈이 주어졌을 때, 어떤 숫자를 지워야 하는지, 그리고 남은 게임 동안 해당 버전에 맞게 최선의 수를 둔다고 가정할 때 두 버전 각각의 기대 점수가 얼마인지 구하시오. 기대 점수는 가능한 모든 점수에 그 확률을 곱한 값의 합이다(최적 플레이를 가정함).
입력
각 입력은 단일 테스트 케이스로 이루어진다. 프로그램은 서로 다른 입력에 대해 여러 번 실행될 수 있다.
각 테스트 케이스는 한 줄로 이루어지며, 숫자들로 구성된 문자열 d (1 ≤ |d| ≤ 9)와 두 정수 a, b (1 ≤ a, b ≤ 6)가 공백으로 구분되어 주어진다. 문자열 d는 1부터 9까지의 숫자 중 일부를 오름차순으로 포함하며, 같은 숫자가 두 번 나오지 않는다. 이것이 현재 게임 상태이다. 정수 a와 b는 현재 굴린 주사위 눈을 나타낸다.
출력
두 줄을 출력하며, 각 줄은 두 부분으로 이루어진다. 먼저 주사위 눈에 따라 지운 숫자들을 오름차순의 문자열로 출력한다. 만약 어떤 숫자도 지울 수 없다면 -1을 출력한다. 그다음 기대 점수를 소수점 다섯째 자리에서 반올림한 실수로 출력한다. 두 부분 사이에는 공백을 하나 둔다.
첫 번째 줄은 점수를 최소화할 때의 최선의 결과이고, 두 번째 줄은 점수를 최대화할 때의 최선의 결과이다. 서로 다른 숫자 조합이 같은 기대 점수를 낳는 경우는 없다.