https://www.acmicpc.net/problem/2343
블루레이의 저장용량(시간)에 따라 블루레이의 개수가 달라진다
개수와 m 을 비교해서 중간값을 찾아간다.
코드의 방향은 맞게 구현했는데 틀린부분은
left 값 세팅을 0 으로 하면 틀린다
만약
2 2
1 9
가 주어졌는데 1이 나올것이다 left를 0으로 세팅하였다면
하지만 정답은 9이다
1이면 블루레이2장에 강의를 모두 담을 수 없다
시간복잡도
강의개수 X 이분탐색(강의개수X강의분량)
N log(100000)
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int m = Integer.parseInt(input[1]);
int[] arr = new int[n];
input = br.readLine().split(" ");
int left = 0;
for(int i = 0; i < n; ++i)
{
arr[i] = Integer.parseInt(input[i]);
left = Math.max(left, arr[i]);//최소한의 값은 가장 긴 강의를 블루레이에 담을 수 있을 만큼 커야한다.
}
int right = 10000 * n;//강의최대 길이 * 강의개수
int cand = 0; //시간
int ans = 0;
//평가는 블루레이개수
while(left <= right)
{
cand = (left+right)/2;
if(cal(arr, cand) > m)
{
left = cand+1;
}
else
{
ans = cand;
right = cand-1;
}
}
System.out.println(ans);
}
public static int cal(int[] arr, int cand)
{
int ret = 1;
int sum = 0;
for(int i = 0; i < arr.length; ++i)
{
sum += arr[i];
if(sum > cand)
{
sum= arr[i];
ret++;
}
}
return ret;
}
}