Dados 2 huevos y k pisos, encuentre el número mínimo de intentos necesarios en el peor de los casos. Este problema es un caso específico de n huevos yk pisos.
Ejemplos:
Input : k = 10 Output : 4 We first try from 4-th floor. Two cases arise, (1) If egg breaks, we have one egg left so we need three more trials. (2) If egg does not break, we try next from 7-th floor. Again two cases arise. We can notice that if we choose 4th floor as first floor, 7-th as next floor and 9 as next of next floor, we never exceed more than 4 trials. Input : k = 100 Output : 14
¿Cuál es el número de ensayos en el peor de los casos si solo tenemos un óvulo?
La respuesta es k. Intentaremos desde el primer piso, luego el segundo, luego el tercero y, en el peor de los casos, el huevo se rompe desde el último piso.
¿Cuál sería nuestro primer piso que probamos si tenemos dos huevos?
Podemos notar que si nuestra respuesta es x, entonces el primer piso que probamos tiene que ser el piso número x. Porque en el peor de los casos, si el huevo se rompe, solo nos queda un huevo y tenemos que probar todos los pisos del 1 al x-1. Entonces el total de ensayos se convierte en 1 + (x – 1).
¿Cuál sería nuestro segundo piso que intentamos si el huevo no se rompe en el primer intento?
El siguiente piso que intentamos tiene que ser x + (x – 1) porque nuestra respuesta óptima es x y si el huevo se rompe desde el piso número x + (x-1) tenemos que intentar linealmente desde el piso número x+1 hasta x- 2.
¿Podemos generalizarlo?
Si el primer huevo no se ha roto hasta el momento, entonces la i-ésima prueba debe ser del piso número x + (x – 1) + … + (x – i – 1).
¿Cuántos pisos podemos cubrir con x intentos?
Podemos observar desde arriba que podemos cubrir x + (x – 1) + (x – 2)…. + 2 + 1 pisos con x ensayos. El valor de esta expresión es x * (x + 1) / 2.
¿Cuál es el x óptimo para un k dado?
Desde arriba, sabemos,
x * (x + 1)/2 >= k The optimal value of x can be written as, ⌈((-1 + √(1+8k))/2)⌉
C++
// CPP program to find optimal number of trials // for k floors and 2 eggs. #include<bits/stdc++.h> using namespace std; int twoEggDrop(int k) { return ceil((-1.0 + sqrt(1 + 8*k))/2.0); } int main() { int k = 100; cout << twoEggDrop(k); return 0; }
Java
// Java program to find // optimal number of trials // for k floors and 2 eggs. import java.io.*; class GFG { static int twoEggDrop(int k) { return (int)Math.ceil((-1.0 + Math.sqrt(1 + 8 * k)) / 2.0); } // Driver code public static void main (String[] args) { int k = 100; System.out.println(twoEggDrop(k)); } } // This code is contributed // by Mahadev.
Python3
# Python3 program to find optimal number # of trials for k floors and 2 eggs. import math as mt def twoEggDrop(k): return mt.ceil((-1.0 + mt.sqrt(1 + 8 * k)) / 2) # Driver Code k = 100 print(twoEggDrop(k)) # This code is contributed # by Mohit Kumar
C#
// C# program to find optimal number // of trials for k floors and 2 eggs. class GFG { static int twoEggDrop(int k) { return (int)System.Math.Ceiling((-1.0 + System.Math.Sqrt(1 + 8 * k)) / 2.0); } // Driver code public static void Main () { int k = 100; System.Console.WriteLine(twoEggDrop(k)); } } // This code is contributed // by mits
PHP
<?php // PHP program to find optimal number // of trials for k floors and 2 eggs. function twoEggDrop($k) { return ceil((-1.0 + sqrt(1 + 8 * $k)) / 2.0); } // Driver Code $k = 100; echo twoEggDrop($k); // This code is contributed // by Akanksha Rai
Javascript
<script> // JavaScript program to find optimal number of trials // for k floors and 2 eggs. function twoEggDrop(k) { return Math.ceil((-1.0 + Math.sqrt(1 + 8*k))/2.0); } var k = 100; document.write( twoEggDrop(k)); </script>
Producción:
14
Complejidad de tiempo : O(1)