본문 바로가기
프로그래밍/문제풀이

[이분 탐색] 백준 2343 기타 레슨

by 하용권 2019. 4. 8.

https://www.acmicpc.net/problem/2343

 

2343번: 기타 레슨

강토는 자신의 기타 레슨 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 레슨이 들어가는데, 블루레이를 녹화할 때, 레슨의 순서가 바뀌면 안된다. 순서가 뒤바뀌는 경우에는 레슨의 흐름이 끊겨, 학생들이 대혼란에 빠질 수 있기 때문이다. 즉, i번 레슨과 j번 레슨을 같은 블루레이에 녹화하려면 i와 j 사이의 모든 레슨도 같은 블루레이에 녹화해야 한다. 강토는 이 블루레이가 얼마나 팔릴지 아직 알 수 없기 때문에, 블루레이의 개수를 가급

www.acmicpc.net

 

길이(mid)를 정해두고, 만약 이 길이를 넘거 같아지면 새로운 블루레이 cd에 길이를 저장하는 방식으로 풀었습니다.

	#include <iostream>
	#include <algorithm>
	#define MAX_SIZE 100000
	using namespace std;
	
	int main(){
		int n, m;
		int arr[MAX_SIZE] = {0};
		int left = 0, right = 0;
		cin >> n >> m;
		
		for(int i = 0; i < n; i++){
			scanf("%d", &arr[i]);
			left = max(left,arr[i]);
		}
		right = 1000000000/m;

		
		while(left +1< right){
			int mid = (right + left) /2;
			int sum = 0, cnt = 0;
			
			for(int i = 0; i < n; i++){
				
				if(sum + arr[i]>= mid){
					cnt++;
					sum = 0;
				}
				sum += arr[i];
			}
			
			if(sum!=0) cnt++;
			
			if(cnt <= m) right = mid;
			else		left = mid;
		}
		
		
		
		cout << left;
		
	}

 

 

반응형