2343번: 기타 레슨
강토는 자신의 기타 레슨 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 레슨이 들어가는데, 블루레이를 녹화할 때, 레슨의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경��
www.acmicpc.net
이번에도 파라메트릭 서치 문제다. 이번엔 반복문의 시작을 음반에서 가장 큰 값으로 해줘야 하는데, 우리가 찾으려는 값이 무엇인지 알아야 한다.
문제를 잘 읽어보면 우리는 결국 블루레이의 크기를 찾아야 되는데 여기에 이분 탐색이 사용된다.
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
int ar[100001], n, m, sum;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> ar[i];
sum += ar[i];
}
ll L = *max_element(ar, ar + n), R = sum;
ll ans = 1e9 + 1;
while (L <= R) {
ll mid = (L + R) / 2, sum = 0, cnt = 0;
for (int i = 0; i < n;) {
sum += ar[i];
if (sum > mid) {
sum = 0; cnt++;
}
else i++;
}
//printf("L= %lld mid= %lld R= %lld sum=%lld cnt=%lld\n", L, mid, R, sum, cnt);
if (cnt < m) {
ans = min(ans, mid);
R = mid - 1;
}
else L = mid + 1;
}
cout << ans << endl;
return 0;
}
이분 탐색을 가장 큰 값에서부터 총 합까지 돌려가면서
for (int i = 0; i < n;) {
sum += ar[i];
if (sum > mid) {
sum = 0; cnt++;
}
else i++;
}
이것처럼 넣어보고 sum값이 현재 블루레이 값보다 크다면 카운트를 하나 올려준다.
for (int i = 0; i < n; i++) {
sum += ar[i];
if (sum > mid) {
cnt++; sum = ar[i];
}
}
if (sum <= mid) cnt++;
이런 식으로 구성해줘도 된다.
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 1992 쿼드트리 (0) | 2020.09.18 |
---|---|
BOJ 10830 행렬 제곱 (0) | 2020.09.16 |
BOJ 2512 예산 (0) | 2020.09.14 |
백준 11401 이항 계수 3 (0) | 2020.09.13 |
백준 10816 숫자 카드 2 (0) | 2020.09.11 |