본문으로 이동
코드패스 by Devin.KR

문제 5261 · 메가 III

공연 회차 나누기

인증 제출 통계 · 5분마다 갱신 · 정답 비율 = 정답 제출 / 전체 제출
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1000ms / 테스트 (언어별 보정은 아래 표)메모리: 측정하지 않음(브라우저 채점)0000.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이다.

관련 서재 장

관련 장

출처: Devin.KR 자체 제작

알고리즘 분류이분 탐색매개변수 탐색그리디누적 합

풀이 작성

연습 채점은 공개 테스트로 실행합니다. 인증 제출은 코드를 봉인한 뒤 새 입력을 실행하고 서버에서 출력을 대조하며 코드와 판정을 저장합니다.

Python 기본 시간 제한 = 문제 시간 제한 × 3 + 2초. 문제별 예외는 아래 표에 반영됩니다. 표준 라이브러리만 지원합니다.

Ctrl+Enter: 연습 채점 · Tab: 들여쓰기 · Esc 후 Tab: 다음 요소로 이동. 언어별 초안은 이 브라우저에 저장됩니다. JavaScript 입력: require('fs').readFileSync(0, 'utf8'), readline 또는 input().

로그인하면 인증 제출을 사용할 수 있습니다.

풀이를 제출하면 여기에서 결과를 확인할 수 있습니다.

    연습 기록은 이 브라우저에 최근 50개를 저장합니다. 인증 기록은 내 제출에서 확인하세요.

    이 브라우저의 연습 기록

      언어별 제한

      테스트 케이스마다 새 전역에서 실행하며 준비 시간은 제외합니다. 시간 초과된 출력은 검사하지 않습니다. 브라우저·기기 성능에 따라 실행 시간이 달라집니다.

      언어엔진(버전)시간 제한메모리
      javascript사용자 브라우저 JavaScript 엔진 (버전은 브라우저에 따라 다름)1000ms / 테스트측정하지 않음(브라우저 채점)
      pythonPyodide 314.0.7 (CPython 3.14 WASM)5000ms / 테스트측정하지 않음(브라우저 채점)