907:Winterim Backpacking Trip

問題文
http://uva.onlinejudge.org/external/9/907.html

n個の休憩地点がある山をk回の休憩をして登る。
一回あたりの登る距離の最悪の長さを最小化せよ。






















解を決め打ちして二分探索した。
動的計画法でも解けるらしい。

#include<iostream>
#include<algorithm>
#include<vector>
 
using namespace std;
 
int n,k;
vector<int>v;
 
bool C(int x){
  int K=0,tmp=0;
  for(int i=0;i<v.size();i++){
    if(x<v[i])return false;
    if(tmp+v[i]<=x)tmp+=v[i];
    else K++,tmp=v[i];
  }
  return K<=k;
}
 
int main(void){
 
  while(cin >> n >> k){
    v.clear();
    v.resize(n+1);
 
    for(int i=0;i<n+1;i++)cin >> v[i];
 
    int l=0,r=100,mid;
     
    while(r-l>1){
      mid=(l+r)/2;
      if(C(mid))r=mid;
      else l=mid;
    }
    cout << r << endl;
  }
 
  return 0;
}