문제 5261 · 메가 III
공연 회차 나누기
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1000ms / 테스트 (언어별 보정은 아래 표) | 메모리: 측정하지 않음(브라우저 채점) | 0 | 0 | 0 | 0.00% |
문제
작은 공연장에서 하루 동안 N개의 팀이 정해진 순서대로 무대에 올라야 한다. i번째 팀의 공연 시간은 t_i분이며, 팀의 순서는 바꿀 수 없다. 공연장은 팀들을 순서대로 연속한 묶음으로 나누어 여러 회차로 운영한다. 회차는 최대 K개까지 열 수 있고, 모든 팀은 정확히 하나의 회차에 속해야 하며, 비어 있는 회차는 만들지 않는다. 회차에는 다음 규칙이 있다. - 한 회차에 들어가는 팀은 최대 W팀이다. - 한 회차 안에서 이웃한 두 팀 사이에는 무대를 정리하는 시간 g분이 반드시 들어간다. 따라서 팀이 c개인 회차의 길이는 그 팀들의 공연 시간의 합에 g × (c − 1)분을 더한 값이다. 회차의 처음과 끝에는 정리 시간이 붙지 않는다. 모든 팀을 위 규칙대로 배정할 때, 가장 긴 회차의 길이를 최소로 만들고 싶다. 그 최솟값을 구하시오. 규칙을 지키는 배정이 하나도 없다면 -1을 출력한다.
입력
첫째 줄에 N, K, W, g가 공백으로 구분되어 주어진다(1 ≤ N ≤ 200,000, 1 ≤ K ≤ N, 1 ≤ W ≤ N, 0 ≤ g ≤ 1,000). 둘째 줄에 t_1, ..., t_N(1 ≤ t_i ≤ 1,000, 정수)이 주어진다.
출력
가장 긴 회차 길이의 최솟값을 한 줄에 출력한다. 배정이 불가능하면 -1을 출력한다.
예제 입력 1
5 2 3 1 4 2 3 5 1
예제 출력 1
11
예제 입력 2
5 1 3 1 4 2 3 5 1
예제 출력 2
-1
예제 입력 3
3 3 1 5 7 7 7
예제 출력 3
7
힌트 펼치기
- 회차 길이의 상한 L을 정하면, 앞에서부터 가능한 만큼 최대한 많이 묶는 그리디로 필요한 회차 수를 셀 수 있다.
- L이 커질수록 필요한 회차 수는 줄지 않으므로 L에 대해 이분 탐색을 한다.
- prefix[i] + i × g 를 만들어 두면 회차 길이가 두 값의 차에서 g를 뺀 값이 되어, 한 회차의 끝을 이분 탐색으로 바로 찾을 수 있다. W×K < N이면 항상 -1이다.
관련 서재 장
알고리즘 분류
이분 탐색매개변수 탐색그리디누적 합풀이 작성
연습 채점은 공개 테스트로 실행합니다. 인증 제출은 코드를 봉인한 뒤 새 입력을 실행하고 서버에서 출력을 대조하며 코드와 판정을 저장합니다.
풀이를 제출하면 여기에서 결과를 확인할 수 있습니다.
연습 기록은 이 브라우저에 최근 50개를 저장합니다. 인증 기록은 내 제출에서 확인하세요.
이 브라우저의 연습 기록
언어별 제한
테스트 케이스마다 새 전역에서 실행하며 준비 시간은 제외합니다. 시간 초과된 출력은 검사하지 않습니다. 브라우저·기기 성능에 따라 실행 시간이 달라집니다.
| 언어 | 엔진(버전) | 시간 제한 | 메모리 |
|---|---|---|---|
| javascript | 사용자 브라우저 JavaScript 엔진 (버전은 브라우저에 따라 다름) | 1000ms / 테스트 | 측정하지 않음(브라우저 채점) |
| python | Pyodide 314.0.7 (CPython 3.14 WASM) | 5000ms / 테스트 | 측정하지 않음(브라우저 채점) |