二分法

SRM462 div2 medium
二分検索でもよく使う方法.

seek  //入力
low = 0; high = 100
while(1) {
  int mid;
  mid = (low+high)/2;
  int calc = ...;  //何らかの処理(midを仮引数に関数の戻り値を使用)
  if(calc > seek) {  ///中間の値が大きい->high(最大値)を下げれば良い.
    ....
    high = mid;
  if(calc == seek) {
    ans = mid;
    break;  
  if(calc < seek) {  //中間の値が小さい=>low(最小値)を挙げれば良い.
    ....
    low = mid;
  }
}
return ans;

//誤差1e-9までの範囲でOKといわれれば、fabs(calc-seek) < EPS;  ->その他  で処理

SRM462

  double getRadix(int age, string candlesLine) {
    int pos = 0;
    while(candlesLine[pos] == '0') {
      pos++;
    }
    candlesLine = candlesLine.substr(pos);
    if(candlesLine == "1") {
      return (age==1) ? -2.0 : -1.0;
    }
    int len = candlesLine.length();
    if(len == 0) { return -1.0; }
//ここから。
    double hi = 100; double lo = 0;
    double mid;
    while(1) {
      mid = (hi+lo)/2;
      DG(mid);
      double tmp = 0;
      for(int i = 0; i < len; i++) {
	if(candlesLine[len-i-1] == '1') {
	  tmp += pow(mid, i);
	}
	if(tmp > 1000) break;
      }
      if(fabs(tmp - age) < eps) {
	break;
      } else if(tmp > age) {
	hi = mid;
      } else if(tmp < age) { lo = mid; }
    }
    return mid;
  }