알고리즘/탐색
이진 탐색 응용 문제 - 1
sim0609
2023. 2. 22. 22:54
이진 탐색과 관련한 문제를 소개하려 한다.
아래 문제가 이진 탐색인 이유는 블루레이의 크기가 모두 같고 녹화 순서가 바뀌지 않아야 하기 때문이다. 블루레이의 크기(mid 값)을 늘리거나 줄여가면서 풀 수 있는 문제이다.
백준 - 2343: 블루레이 만들기
https://www.acmicpc.net/problem/2343
2343번: 기타 레슨
강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경
www.acmicpc.net
코드
#include <iostream>
#include <vector>
// #include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int lesson, blue, n;
int s = 0, e = 0;
cin >> lesson >> blue;
vector <int> num(lesson);
for (int i = 0; i < lesson; i++) {
cin >> n;
num[i] = n;
if (s < num[i]) { // 이진 탐색의 시작 인덱스: 최대 레슨 시간
s = num[i];
}
e += num[i]; // 이진 탐색의 마지막 인덱스: 모든 레슨 시간의 합
}
// sort(num.begin(), num.end());
while (s <= e) {
int mid = (s + e) / 2;
int sum = 0;
int cnt = 0;
// mid 값으로 모든 레슨을 저장할 수 있는지 확인해보기
// 현재 mid값에 해당하는 블루 레이 개수 세기
for (int i = 0; i < lesson; i++) {
if (sum + num[i] > mid) {
cnt++;
sum = 0;
}
sum += num[i];
}
if (sum != 0) {
cnt++;
}
if (cnt > blue) { // mid 값 크기로 블루 레이에 모든 레슨을 저장할 수 없으면 시작 인덱스는 mid + 1
s = mid + 1;
}
else { // mid 값 크기로 블루 레이에 모든 레슨을 저장할 수 있으면 종료 인덱스는 mid - 1
e = mid - 1;
}
}
cout << s << endl;
}