intさわだんのBlack History

刹那的レジェンドになりたい。

POJ(PKU) 3723 Monthly Expense

二分探索で最小値を求める。

#include <cstdio>

using namespace std;
const int INF = 100002;
int n,m,d[1000002];

bool ch(int x){
  int u = 1;
  int sum = 0;
  for(int i = 0;i < n;i++){
    if(d[i] > x)return false;
    if(d[i] + sum > x){
      u++;
      sum = d[i];
    }else{
      sum += d[i];
    }
  }
  
  if(u <= m) return true;
  else return false;
}


int main(){
  

  scanf("%d%d",&n,&m);
  
  for(int i = 0;i < n;i++){
    scanf("%d",&d[i]);
  }
  
  int lb = 0,ub = INF;
  
  while(ub - lb > 1){
    int mid = (ub + lb) / 2;
    if(ch(mid)) ub = mid;
    else lb = mid;
  }

  printf("%d\n",ub);
  
  return 0;
  
}