현우는 용돈을 효율적으로 활용하고, 돈을 펑펑 쓰지 않기 위해서 앞으로 N일 동안 자신이 매일 사용할 금액을 계산하고, 정확히 통장에서 M번, K원 씩 출금해서 사용하기로 결정했습니다. 현재 수중에 있는 돈으로 하루를 보낼 수 있으면 그대로 사용합니다. 하지만, 부족하다면, 수중에 있는 돈은 통장에 집어넣은 뒤 K원을 인출해서 사용할 것입니다. 이때 현우가 필요한 최소 금액 K를 계산하는 프로그램을 작성해주세요.
#include <bits/stdc++.h>
using namespace std;
int N, M, K, arr[100'001];
int low, mid, high, maxMoney, ans;
bool isAvailale(int target) {
// 하루를 살기에는 금액이 너무 작음.
if (maxMoney > target) return false;
int cnt = 1, curMoney = target;
for (int i = 0; i < N; ++i) {
if (curMoney >= arr[i]) curMoney -= arr[i];
else curMoney = target - arr[i], cnt++;
}
return cnt <= M;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> N >> M;
for (int i = 0; i < N; ++i) {
cin >> arr[i];
high += arr[i];
maxMoney = max(maxMoney, arr[i]);
}
while (low <= high) {
mid = low + (high - low) / 2;
if (isAvailale(mid)) high = mid - 1, ans = mid;
else low = mid + 1;
}
cout << ans;
}