Reducir N a 0 o menos mediante operaciones X e Y dadas

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:
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:

  1. Actualice el valor de N a ⌊N/2⌋ + 10 si N > N/2 + 10 y X > 0.
  2. Actualice el valor de N a N – 10 como máximo Y veces.
  3. Compruebe si el valor actualizado de N es menor que igual a 0 o no.
  4. 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>
Producción: 

Yes

 Complejidad de Tiempo: O(X + Y)
 Espacio Auxiliar :O(1)

Publicación traducida automáticamente

Artículo escrito por gowtham81 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *