fork(2) download
  1. import java.util.*;
  2. import java.io.*;
  3. class CLDROP{
  4. static int[][] dp;
  5. public static void main(String args[])throws Exception{
  6. precal(14,5000);
  7. Reader re = new Reader(System.in);
  8. int T = re.nextInt();
  9. for(; T>0; T--){
  10. int n = re.nextInt();
  11. int h = re.nextInt();
  12. if(n<10)
  13. System.err.println(n+" "+h);
  14. int v;
  15. if(n>=14)
  16. v = lg(h);
  17. else{
  18. v = dp[h][n];
  19. if(v==0)
  20. v = lg(h);
  21. }
  22. System.out.println(v);
  23. }
  24. }
  25.  
  26. static int lg(int x){
  27. return 1+(int)(Math.log(x)/Math.log(2));
  28. }
  29.  
  30. static void precal(int n, int h){
  31. dp = new int[h+1][n+1];
  32. for(int i=1; i<=h; i++)
  33. dp[i][1] = i;
  34. for(int i=1; i<=n; i++)
  35. dp[1][i] = 1;
  36. for(int i=2; i<=h; i++){
  37. for(int j=2; j<=n; j++){
  38. dp[i][j] = Integer.MAX_VALUE;
  39. for(int k=1; k<=i; k++){
  40. int a = dp[k-1][j-1];
  41. if(a==0 && k-1!=0)
  42. a = lg(k-1);
  43. int b = dp[i-k][j];
  44. if(b==0 && i-k!=0)
  45. b = lg(i-k);
  46. int m = 1 + Math.max(a, b);
  47. if(m<dp[i][j])
  48. dp[i][j] = m;
  49. }
  50. if(dp[i][j]==lg(i))
  51. break;
  52. }
  53. }
  54. }
  55. }
  56.  
  57. class Reader{
  58. br = new BufferedReader(new InputStreamReader(in));
  59. st = new StringTokenizer("");
  60. }
  61.  
  62. String next() throws Exception{
  63. while(!st.hasMoreTokens())
  64. st = new StringTokenizer(br.readLine());
  65. return st.nextToken();
  66. }
  67.  
  68. int nextInt() throws Exception{
  69. return Integer.parseInt(next());
  70. }
  71. }
  72.  
Success #stdin #stdout #stderr 3.3s 320576KB
stdin
1
1 10
stdout
10
stderr
1 10