package com.interview.books.ninechapter;
/**
* Created_By: stefanie
* Date: 14-12-12
* Time: 上午11:41
*/
public class NC5_ThrowBalls {
//times[i][k]: min times throw k ball to find out P in building with i floor.
//initialize: times[i][1] = i - 1; //throw from 1 to i - 1. (last floor not need to try, it will break)
//function: times[i][k] = min(1 + max(times[j][k-1], times[i-j][k] (i != j)) for all j from 1 ~ i)
// k-th ball break at floor j
//result: times[N][K]
//Time: O(KN^2), Space: O(NK)
public int minTimes(int N, int K){
int[][] times = new int[N + 1][K + 1];
//init
for(int i = 1; i <= N; i++) times[i][1] = i - 1;
//function
for(int k = 2; k <= K; k++){
for(int i = 1; i <= N; i++){
times[i][k] = Integer.MAX_VALUE;
for(int j = 1; j <= i; j++){
int tries = times[j][k - 1];
if(j < i) tries = Math.max(tries, times[i - j][K]);
times[i][k] = Math.min(times[i][k], tries + 1);
}
}
}
return times[N][K];
}
public static void main(String[] args){
NC5_ThrowBalls experiment = new NC5_ThrowBalls();
System.out.println(experiment.minTimes(100, 2)); //14
}
}