Dados tres números enteros N , X e Y, la tarea es verificar si es posible reducir N a 0 o menos mediante las siguientes operaciones:
- Actualice N a ⌊N/2⌋ + 10, como máximo X veces
- Actualice N a N – 10, como máximo Y veces.
Ejemplo:
Entrada: N = 100, X = 3, Y = 4
Salida: Sí
Explicación:
Actualice N = 100 a ⌊100/2⌋ + 10 = 60.
Actualice N = 60 a 60 − 10 = 50.
Actualice N = 50 a ⌊ 50/2⌋ + 10 = 35.
Actualice N = 35 a ⌊35/2⌋ + 10 = 27.
Actualice N = 27 a 27 − 10 = 17.
Actualice N = 17 a 17 − 10 = 7.
Actualice N = 7 a 7 − 10 = −3.Entrada: N = 50, X = 1, Y = 2
Salida: No
Enfoque: Este problema se puede resolver en base a las siguientes observaciones:
- Caso 1: Si ⌊N/2⌋ + 10 >= N , realice solo la segunda operación ya que la primera operación aumentará el valor N .
- Caso 2: si se realiza la primera operación seguida de la segunda operación, el resultado es:
Operación 1: N = ⌊N/2⌋ + 10
Operación 2: (⌊N/2⌋ + 10) – 10 = ⌊N/2⌋
- El valor de N se reduce a (⌊N/2⌋) .
- Caso 3: si se realiza la segunda operación seguida de la primera operación, el resultado es:
Operación 2: N = N – 10
Operación 1: ⌊(N – 10)/2⌋ + 10 = (⌊N/2⌋ – 5 + 10) = (⌊N/2⌋ + 5)
- El valor de N se reduce a (⌊N/2⌋ + 5) .
De las dos observaciones anteriores, si N > N/2 +10 , entonces se puede concluir que, para reducir el valor de N a 0 o menos, la primera operación debe realizarse antes que la segunda operación para disminuir el valor de N.
Siga los pasos a continuación para resolver el problema:
- Actualice el valor de N a ⌊N/2⌋ + 10 si N > N/2 + 10 y X > 0.
- Actualice el valor de N a N – 10 como máximo Y veces.
- Compruebe si el valor actualizado de N es menor que igual a 0 o no.
- Si N ≤ 0, imprima “Sí” . De lo contrario, escriba “No” .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to check if N can be // reduced to <= 0 or not bool NegEqu(int N, int X, int Y) { // Update N to N/2 + 10 at most X times while (X-- and N > N/2 + 10) { N = N / 2 + 10; } // Update N to N - 10 Y times while (Y--) { N = N - 10; } if (N <= 0) return true; return false; } // Driver Code int main() { int N = 100; int X = 3; int Y = 4; if (NegEqu(N, X, Y)) { cout << "Yes"; } else { cout << "No"; } }
Java
// Java program to implement // the above approach class GFG{ // Function to check if N can be // reduced to <= 0 or not static boolean NegEqu(int N, int X, int Y) { // Update N to N/2 + 10 at most X times while (X > 0 && (N > N / 2 + 10)) { N = N / 2 + 10; X -= 1; } // Update N to N - 10 Y times while (Y > 0) { N = N - 10; Y -= 1; } if (N <= 0) return true; return false; } // Driver Code public static void main(String[] args) { int N = 100; int X = 3; int Y = 4; if (NegEqu(N, X, Y)) { System.out.println("Yes"); } else { System.out.println("No"); } } } // This code is contributed by jana_sayantan
Python3
# Python3 program to implement # the above approach # Function to check if N can be # reduced to <= 0 or not def NegEqu(N, X, Y): # Update N to N/2 + 10 at most X times while (X and N > N // 2 + 10): N = N // 2 + 10 X -= 1 # Update N to N - 10 Y times while (Y): N = N - 10 Y -= 1 if (N <= 0): return True return False # Driver Code if __name__ == '__main__': N = 100 X = 3 Y = 4 if (NegEqu(N, X, Y)): print("Yes") else: print("No") # This code is contributed by mohit kumar 29
C#
// C# program to implement // the above approach using System; class GFG{ // Function to check if N can be // reduced to <= 0 or not public static bool NegEqu(int N, int X, int Y) { // Update N to N/2 + 10 at most X times while (X > 0 && (N > N / 2 + 10)) { N = N / 2 + 10; X -= 1; } // Update N to N - 10 Y times while (Y > 0) { N = N - 10; Y -= 1; } if (N <= 0) return true; return false; } // Driver Code public static void Main(String[] args) { int N = 100; int X = 3; int Y = 4; if (NegEqu(N, X, Y)) { Console.WriteLine("Yes"); } else { Console.WriteLine("No"); } } } // This code is contributed by jana_sayantan
Javascript
<script> // JavaScript implementation of the above approach // Function to check if N can be // reduced to <= 0 or not function NegEqu(N, X, Y) { // Update N to N/2 + 10 at most X times while (X > 0 && (N > N / 2 + 10)) { N = N / 2 + 10; X -= 1; } // Update N to N - 10 Y times while (Y > 0) { N = N - 10; Y -= 1; } if (N <= 0) return true; return false; } // Driver code let N = 100; let X = 3; let Y = 4; if (NegEqu(N, X, Y)) { document.write("Yes"); } else { document.write("No"); } // This code is contributed by code_hunt. </script>
Yes
Complejidad de Tiempo: O(X + Y)
Espacio Auxiliar :O(1)