멀티 플레이어 게임
시간 제한3초메모리 제한1024 MB
브루는 길이 N의 순열 A를 제출하고, 민규는 피벗으로 분할된 순열 A'만 보고 길이 L의 이진 문자열 S를 정확히 복원해야 합니다.
문제
이 문제는 투 스텝 인터랙티브 문제입니다.
브루와 민규는 서울과학고등학교에서 열리는 전략 서바이벌 게임 '더 챌린저스'에 팀으로 참가했다.
예선 게임에서는 두 팀원 중 한 명이 송신자, 다른 한 명이 수신자 역할을 맡는다. 게임이 진행되는 동안 두 팀원은 서로 다른 방에 들어가며 소통할 수 없다. 브루가 송신자, 민규가 수신자 역할을 맡는다.
게임의 딜러 동현은 먼저 브루의 방에 들어가 길이 의 비트스트링 ('0'과 '1'로만 이루어진 문자열)를 제시한다. 이후 브루는 길이 의 순열 를 제출해야 한다. 동현은 브루가 제출한 순열을 다음 과정으로 섞는다.
- 먼저 순열 의 수 중 하나를 피봇 로 선택한다.
- 이후 보다 작은 수는 원래 순열에서의 순서대로 왼쪽에, 보다 큰 수는 원래 순열에서의 순서대로 오른쪽에 놓는다. 이렇게 섞인 순열을 이라고 하자.
예를 들어 원래 순열이 이고 피봇이 라면, 섞인 순열은 가 된다. 이후 동현은 민규에게 순열 를 전달한다. 민규가 를 보고 비트스트링 를 정확히 맞히면 게임에서 승리한다.
민규가 운 좋게 를 맞히는 것을 막기 위해, 동현은 처음에 브루에게 개의 비트스트링을 제시한다. 브루가 제출한 개의 순열 각각을 동현이 섞어 새로운 순열 개를 만들고, 이 개의 순열을 임의의 순서로 민규에게 전달한다.
브루와 민규는 게임 전에 전략을 논의할 수 있다. 또한 게임 전에 과 의 값을 직접 정할 수 있다. 과 의 값에 따라 게임의 난이도와 승리 시 얻는 점수가 정해진다. 난이도를 쉽게 정하면 승리할 수 있겠지만, 얻는 점수가 더 낮아진다.
브루와 민규가 게임에서 승리할 수 있는 최선의 전략을 만들어 보자.
제한
- 은
brue또는mingyu - 는 길이 의 문자열
- 는 '0' 또는 '1' ()
- ()
- ()
힌트
출력 버퍼를 비우는 방법은 다음과 같다.
- C:
fflush(stdout) - C++:
std::cout << std::flush - Java:
System.out.flush() - Python:
sys.stdout.flush()
이외의 언어에 대해서는 언어별 명세를 참고해야 한다.