숙제
시간 제한3초메모리 제한1024 MB
ask 호출을 N + N log2 N회 이하로 사용해 모든 학생이 YES라고 답하도록 질문 목록과 질문 순서를 찾습니다.
숙제
N명의 학생이 한 줄로 서 있고, 순서대로 이라고 부른다 ().
각 학생에게 두 질문 중 하나를 해서 숙제를 했는지 확인할 수 있다.
Q1(값은0): "숙제를 끝냈습니까?"Q2(값은1): "숙제에 늦었습니까?"
학교의 이상한 관습 때문에, "아니오"라고 답해야 하는 학생은 수업이 끝날 때까지 답을 망설인다. 이 학생이 "아니오"라고 답했다는 사실은 이미 알고 있다.
질문 을 준비하면 학생들이 순서대로 와서 답하고, 그동안 답을 기다려야 한다.
- 즉, 이 YES라고 답하고 이 "아니오"라고 표현하면, YES는 개만 받는다.
- 이 모두 YES라고 답하면 YES를 개 받는다.
질문은 컴퓨터에 적어 온라인에 올린다. 모니터에 뜨는 것은 큰 YES 하나뿐이고, 얻을 수 있는 것은 답의 순서뿐이다.
온라인 시스템이 고장 나서 질문은 미리 정해진 순서 대로 출제된다.
- 즉, 을 입력하면 질문은 순서로 물어진다.
질문을 던지는 수업은 최대 번까지 가질 수 있다.
함수 question을 작성한다.
- 입력: 학생들의 상태와 순서를 담은
Student객체 .n()은 학생 수 을 반환한다..ask(Q)는 질문 목록Q를 바탕으로 'YES' 목록을 반환한다.Q는 길이가 이고Q1과Q2로 이루어진다. 반환 목록의 길이가 일 필요는 없다. 반환값은['YES' for j in range(M)]형태이며, 여기서 은 YES의 개수이다: .
출력: 개의 YES를 받는 입력 질문 목록 과 순서 . 전자는 컴퓨터에 입력하는 순서이고, 후자는 가 물어지는 순서이다.
모든 학생이 숙제를 끝냈거나 늦었다고 가정하며, 수업이 진행되어도 상태는 바뀌지 않는다.
주의: 채점 코드에서는 Student의 보호 속성(protected attribute) 이름이 제출용 코드와 다르게 되어 있다.