돕거나, 벌을 받거나
시간 제한1초메모리 제한128 MB
도울 사람의 순서 있는 부분집합을 고르는데, 각 도움의 종료 시각이 누적되고 돕지 않은 사람마다 벌점이 붙으므로 예산 K 안에서 가장 큰 부분집합을 찾는다.
문제
금융 전문가들이 수감된 교정 시설에서 곧 연례 사회봉사 활동이 열린다. 각 참가자에게는 재정 문제를 도와줄 수 있는 명의 사람 집합 와 분의 시간 한도가 주어진다.
번째 사람()에 대해서는 두 정수가 알려져 있다. 그 사람에게 조언을 하지 않기로 선택하면 부과되는 벌점 와, 조언을 하는 데 필요한 시간 (분)이다.
참가자는 시간 에 시작한다. 시간 에 번째 사람을 돕기 시작하면 늦어도 까지는 마쳐야 하며, 값 가 부과되고, 시간 가 되기 전에는 다른 사람을 도울 수 없다(사람들은 한 번에 한 명씩, 연달아 돕는다).
실제로 도움을 받은 사람들의 집합을 라 하면, 사용한 총 시간(분)은 다음과 같다.
시간 한도 분을 넘기지 않으면서 한 참가자가 도울 수 있는 사람 수의 최댓값을 구하는 프로그램을 작성하여라.
입력
입력은 여러 참가자에 대한 자료로 이루어진다. 각 참가자의 자료는 공백 하나로 구분된 두 정수 과 가 있는 줄로 시작한다. 각각 사람 수와 시간 한도를 의미하며 , 이다. 이어지는 개의 줄에는 각각 도움을 줄 한 사람의 벌점과 소요 시간을 나타내는 두 정수가 공백 하나로 구분되어 주어지며, 모든 정수는 이상 이하이다. 입력은 두 개의 이 있는 줄로 끝난다.
출력
각 참가자마다 i: X 형식의 한 줄을 출력한다. 여기서 i는 참가자가 등장한 순서대로 부터 센 번호이고, X는 시간 한도 분을 넘기지 않으면서 도울 수 있는 사람 수의 최댓값이다. 사용한 총 시간을 이내로 유지하는 것이 불가능하면 대신 i: Mission Impossible을 출력한다.