- ํ์ฐ์ ํต์ฅ ์์ก์ ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.
- ์ ํํ M๋ฒ ๋ง์ถ๊ธฐ ์ํด ์๋ฏธ์๋ ์ ๊ธ๊ณผ ์ถ๊ธ์ ๋ฐ๋ณตํ ์ ์์ผ๋ฏ๋ก ์ธ์ถ ๊ธ์ก์ด K์ผ ๋ ๋ฐ๋์ ์ธ์ถํด์ผ ํ๋ ํ์๊ฐ M์ดํ๋ฉด ๋๋ค.
K์ ์ด๊ธฐ๊ฐ์ด ๋ ์ ์๋ ๊ฐ ์ค์ ์ต์๊ฐ์ ์ต๋ N์ผ๊ณผ ํ๋ฃจ์ ์ธ ์ ์๋ ์ต๋ ๊ธ์ก(10,000์)์ด๋ค. ๋๋ต 10์ต ์ ๋ ๋๋๋ฐ ์ด๋ถ ํ์์ผ๋ก ์ฐพ๊ฒ ๋๋ฉด 2^30 ์ ๋์ด๊ธฐ ๋๋ฌธ์ 30๋ฒ๋ง ํ์ํ๋ฉด ์ฐพ์ ์ ์๋ค.
์ต๋์ ์ต์์ ์ค๊ฐ ๊ฐ์ธ ์ธ์ถ ๊ธ์ก k๋ฅผ ๊ตฌํ ํ ํด๋น ์ธ์ถ ๊ธ์ก์ผ๋ก N์ผ ๊ฐ ์ฉ๋์ ์ผ์ ๋ ์ธ์ถ ํ์๊ฐ M์ ๋์ง ์์ผ๋ฉด ํ์ฌ ์ธ์ถ ๊ธ์ก์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฏ๋ก ์ต์๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ๋ค์ ํ์์ ๋ ์์ ์ธ์ถ ๊ธ์ก ๊ตฌ๊ฐ์์ ์ํํ๋ค. ์ต๋๊ฐ์ ์ธ์ถ ๊ธ์ก k ๋ณด๋ค ์์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
ํ์ง๋ง ์ธ์ถ ํ์๊ฐ M์ ๋๊ฒ ๋๋ฉด ํ์ฌ ์ธ์ถ ๊ธ์ก k๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํด์ ๋ ์ปค์ ธ์ผ ํ๋ค๋ ๊ฒ์ด๋ฏ๋ก ๋ ํฐ ์ธ์ถ ๊ธ์ก ๊ตฌ๊ฐ์์ ํ์์ ์ํํด์ผ ํ๋ค. ์ด๋๋ ์ต์๊ฐ(low)์ k+1 ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
ํ์์ ์ํํ๋ ํจ์ run() ์์๋ ํ์ฌ ์ธ์ถ ๊ธ์ก k๊ฐ ๋น์ผ ์ฉ๋ cash ๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ ํญ์ false ๋ฅผ ๋ฐํํ๋ค. ์ธ์ถ ๊ธ์ก์ด ์ฉ๋ ๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ ์๋ฌด๋ฆฌ ์ธ์ถ์ ๋ฐ๋ณตํด๋ ์์ฉ์๊ธฐ ๋๋ฌธ์ด๋ค.
import java.util.*;
import java.io.*;
public class Main {
static final long MAX_N = 100_000;
static final long MAX_DAY_CASH = 10_000;
static int N;
static int M;
static long[] passbook;
static boolean run(long K) {
int count = 1;
long leftMoney = K;
for (long cash : passbook) {
if (cash > K) {
return false;
}
if (cash <= leftMoney) {
leftMoney -= cash;
} else {
leftMoney = K - cash;
count++;
}
}
return count <= M;
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
passbook = new long[N];
for (int i = 0; i < N; i++) {
passbook[i] = sc.nextLong();
}
long low = 0;
long high = MAX_N * MAX_DAY_CASH;
while (low <= high) {
long k = (low + high) / 2;
boolean result = run(k);
if (result) {
high = k - 1;
} else {
low = k + 1;
}
}
System.out.println(low);
}
}