728x90
문제 2343번
https://www.acmicpc.net/problem/2343
2343번: 기타 레슨
강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경
www.acmicpc.net
mid의 조건을 블루레이 크기로 잡는다. 여기서 최소 블루레이의 크기는 담을 수 없는 경우는 배제해야되기 때문에 배열에서 가장 큰 요소로 넣어준다. 그리고 가장 큰 블루레이는 모든 요소의 합(100000(최대N)*10000(최대강의길이))이 된다. 강의들을 sum에 합치다가 sum이 임의로 잡아준 블루레이 크기(mid)보다 크면 블루레이 개수를 하나 증가시키고 sum을 다시 0으로 만들어 준 뒤 i가 하다가 if문에 걸려서 안 포함되었으니 i를 하나 빼 포함되도록 해준다. 그렇게 count해서 블루레이 개수가 M보다 크거나 같으면 블루레이 크기를 늘려주고 아니면 블루레이 크기를 줄여준다.블루레이 크기의 최소를 구하는 것이기 때문에 start를 출력해준다.
#include <iostream>
#include <algorithm>
using namespace std;
int Max = 0;
int N, M;
int* lecture;
int binarySearch() {
int start = Max;
int end = 1000000000;
while (start <= end) {
int mid = (start + end) / 2;
int sum = 0, count = 0;
for (int i = 0; i < N; i++) {
sum += lecture[i];
if (sum > mid) {
count++;
sum = 0;
i--;
}
}
if (count >= M) { //블루레이 개수가 많으면
start = mid + 1; //블루레이 크기를 늘려줌
}
else {
end = mid - 1;
}
}
return start;
}
int main() {
cin >> N >> M;
lecture = new int[N];
int* blue = new int[M];
for (int i = 0; i < N; i++) {
cin >> lecture[i];
Max = max(lecture[i], Max);
}
cout << binarySearch();
return 0;
}
728x90
'백준 > C++' 카테고리의 다른 글
[C++] 백준 2839번 - 설탕 배달 (0) | 2024.04.28 |
---|---|
[C++] 백준 2798번 - 블랙잭 (0) | 2024.04.27 |
[C++] 백준 10953번 - A+B-6 (1) | 2024.04.25 |
[C++] 백준 25305번 - 커트라인 (0) | 2024.04.24 |
[C++] 백준 2512번 - 예산 (0) | 2024.04.23 |