정확히 M번을 맞추기 위해서 남은 금액이 그날 사용할 금액보다 많더라도 남은 금액은 통장에 집어넣고 다시 K원을 인출할 수 있다.
#include <iostream>
#include <algorithm>
#include <limits.h>
using namespace std;
typedef int ll;
ll tb1[100001];
int n, m;
// ll go(ll nn){ fail
// ll cnt = 1;
// int account = nn;
// for(int i=0;i<n;++i){
// if(account - tb1[i] >= 0){
// account -= tb1[i];
// }
// else{
// cnt++;
// account = nn;
// }
// }
// return cnt;
// }
ll go(ll nn) {
ll cnt = 1;
int account = 0;
for (int i = 0; i<n; ++i) {
if (account + tb1[i] > nn) {
cnt++;
account = tb1[i];
}
else {
account += tb1[i];
}
}
return cnt;
}
int main(void) {
ll sum = 0, maxv = 0;
cin >> n >> m;
for (int i = 0; i<n; ++i) {
cin >> tb1[i];
maxv = max(maxv, tb1[i]);
}
ll left = maxv;
ll right = 1987654321; // large value
while (left <= right) {
ll mid = (left + right) / 2; // mid는 정한 가격
//cout << mid << endl;
int tempv = go(mid);
if (tempv > m) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
cout << left << endl;
return 0;
}
// ll go(ll nn){
// ll cnt = 1;
// int account = nn;
// for(int i=0;i<n;++i){
// if(account - tb1[i] >= 0){
// account -= tb1[i];
// }
// else{
// cnt++;
// account = nn - tb1[i];
// }
// }
// return cnt;
// }