본문 바로가기

백준/C++

[C++] 백준 2343번 - 기타 레슨

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