Comprueba si es posible sobrevivir en la isla

Eres un pobre en una isla. Solo hay una tienda en esta isla, esta tienda está abierta todos los días de la semana excepto los domingos. Considere las siguientes restricciones: 

  • N – Unidad máxima de alimentos que puedes comprar cada día.
  • S: número de días que debe sobrevivir.
  • M – Unidad de alimento requerida cada día para sobrevivir.

Actualmente, es lunes y necesita sobrevivir durante los próximos S días. 
Encuentra el número mínimo de días en los que necesitas comprar comida en la tienda para poder sobrevivir los próximos S días, o determina que no es posible sobrevivir. 
Ejemplos: 

Entrada: S = 10 N = 16 M = 2 
Salida: Sí 2 
Explicación 1: Una posible solución es comprar una caja el primer día (lunes), es suficiente comer de esta caja hasta el 8º día (lunes) inclusive. Ahora, el noveno día (martes), compras otra caja y usas los chocolates que contiene para sobrevivir el noveno y décimo día.
Entrada: 10 20 30 
Salida: No 
Explicación 2: No puedes sobrevivir incluso si compras comida porque la cantidad máxima de unidades que puedes comprar en un día es menos que la comida requerida para un día.

Enfoque: 
En este problema, el enfoque codicioso de comprar alimentos durante algunos días tempranos consecutivos es la dirección correcta. 
Si podemos sobrevivir durante los primeros 7 días, entonces podemos sobrevivir cualquier cantidad de días, para eso debemos verificar dos cosas 
-> Verificar si podemos sobrevivir un día o no. 
-> (S >= 7) Si compramos alimentos en los primeros 6 días de la semana y podemos sobrevivir durante la semana, es decir, el total de alimentos que podemos comprar en una semana (6*N) es mayor o igual que el total de alimentos que requieren sobrevivir en una semana (7*M) entonces podemos sobrevivir. 

Nota: Estamos comprando la comida en los primeros 6 días porque contamos desde el lunes y la tienda permanecerá cerrada el domingo.
Si alguna de las condiciones anteriores no es cierta, entonces no podemos sobrevivir más 

la ecuación se puede derivar como:

la cantidad de comida que compramos debe ser >= la cantidad de comida necesaria para sobrevivir.—-> ecuación 1

la cantidad de alimentos que compramos = número de veces que compramos (días) * cantidad de alimentos que obtenemos por una sola compra (N)

la cantidad de comida requerida para sobrevivir = la cantidad de días que necesitamos para sobrevivir (S) * la cantidad de comida requerida en cada día (M).

ahora de nuestra ecuación 1:

días * N >= S * M

por lo tanto, días = techo (S * M) / N

CPP

// C++ program to find the minimum days on which
// you need to buy food from the shop so that you
// can survive the next S days
#include <bits/stdc++.h>
using namespace std;
 
// function to find the minimum days
void survival(int S, int N, int M)
{
 
    // If we can not buy at least a week
    // supply of food during the first week
    // OR We can not buy a day supply of food
    // on the first day then we can't survive.
    if (((N * 6) < (M * 7) && S > 6) || M > N)
        cout << "No\n";
    else {
        // If we can survive then we can
        // buy ceil(A/N) times where A is
        // total units of food required.
        int days = (M * S) / N;
        if (((M * S) % N) != 0)
            days++;
        cout << "Yes " << days << endl;
    }
}
 
// Driver code
int main()
{
    int S = 10, N = 16, M = 2;
    survival(S, N, M);
    return 0;
}

C

// C program to find the minimum days on which
// you need to buy food from the shop so that you
// can survive the next S days
#include <stdio.h>
 
// function to find the minimum days
void survival(int S, int N, int M)
{
 
    // If we can not buy at least a week
    // supply of food during the first week
    // OR We can not buy a day supply of food
    // on the first day then we can't survive.
    if (((N * 6) < (M * 7) && S > 6) || M > N)
        printf("No\n");
    else {
        // If we can survive then we can
        // buy ceil(A/N) times where A is
        // total units of food required.
        int days = (M * S) / N;
        if (((M * S) % N) != 0)
            days++;
        printf("Yes %d\n",days);
    }
}
 
// Driver code
int main()
{
    int S = 10, N = 16, M = 2;
    survival(S, N, M);
    return 0;
}
 
// This code is contributed by rexomkar

Java

// Java program to find the minimum days on which
// you need to buy food from the shop so that you
// can survive the next S days
import java.io.*;
 
class GFG {
 
    // function to find the minimum days
    static void survival(int S, int N, int M)
    {
 
        // If we can not buy at least a week
        // supply of food during the first
        // week OR We can not buy a day supply
        // of food on the first day then we
        // can't survive.
        if (((N * 6) < (M * 7) && S > 6) || M > N)
            System.out.println("No");
 
        else {
 
            // If we can survive then we can
            // buy ceil(A/N) times where A is
            // total units of food required.
            int days = (M * S) / N;
 
            if (((M * S) % N) != 0)
                days++;
 
            System.out.println("Yes " + days);
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int S = 10, N = 16, M = 2;
 
        survival(S, N, M);
    }
}
 
// This code is contributed by vt_m.

Python3

# Python3 program to find the minimum days on 
# which you need to buy food from the shop so
# that you can survive the next S days
def survival(S, N, M):
 
# If we can not buy at least a week
# supply of food during the first week
# OR We can not buy a day supply of food
# on the first day then we can't survive.
    if (((N * 6) < (M * 7) and S > 6) or M > N):
        print("No")
    else:
         
    # If we can survive then we can
    # buy ceil(A / N) times where A is
    # total units of food required.
        days = (M * S) / N
         
        if (((M * S) % N) != 0):
            days += 1
        print("Yes "),
        print(days)
 
# Driver code
S = 10; N = 16; M = 2
survival(S, N, M)
 
# This code is contributed by upendra bartwal

C#

// C# program to find the minimum days
// on which you need to buy food from
// the shop so that you can survive
// the next S days
using System;
 
class GFG {
 
    // function to find the minimum days
    static void survival(int S, int N, int M)
    {
 
        // If we can not buy at least a week
        // supply of food during the first
        // week OR We can not buy a day
        // supply of food on the first day
        // then we can't survive.
        if (((N * 6) < (M * 7) && S > 6) || M > N)
            Console.Write("No");
        else {
             
            // If we can survive then we can
            // buy ceil(A/N) times where A is
            // total units of food required.
            int days = (M * S) / N;
             
            if (((M * S) % N) != 0)
                days++;
                 
            Console.WriteLine("Yes " + days);
        }
    }
 
    // Driver code
    public static void Main()
    {
        int S = 10, N = 16, M = 2;
         
        survival(S, N, M);
    }
}
 
// This code is contributed by
// Smitha Dinesh Semwal

PHP

<?php
// PHP program to find the
// minimum days on which
// you need to buy food
// from the shop so that you
// can survive the next S days
 
// Function to find
// the minimum $days
function survival($S, $N, $M)
{
 
    // If we can not buy at least a week
    // supply of food during the first week
    // OR We can not buy a day supply of food
    // on the first day then we can't survive.
    if ((($N * 6) < ($M * 7) &&
          $S > 6) || $M >$N)
        echo "No";
    else
    {
         
        // If we can survive then we can
        // buy ceil(A/N) times where A is
        // total units of food required.
        $days = ($M * $S) / $N;
        if ((($M * $S) % $N) != 0)
            $days++;
        echo "Yes " , floor($days) ;
    }
}
 
    // Driver code
    $S = 10; $N = 16; $M = 2;
    survival($S, $N, $M);
     
// This code is contributed by anuj_67
 
?>

Javascript

<script>
// JavaScript program to find the minimum days on which
// you need to buy food from the shop so that you
// can survive the next S days
 
    // function to find the minimum days
    function survival(S, N, M)
    {
  
        // If we can not buy at least a week
        // supply of food during the first
        // week OR We can not buy a day supply
        // of food on the first day then we
        // can't survive.
        if (((N * 6) < (M * 7) && S > 6) || M > N)
            document.write("No");
  
        else {
  
            // If we can survive then we can
            // buy ceil(A/N) times where A is
            // total units of food required.
            let days = (M * S) / N;
  
            if (((M * S) % N) != 0)
                days++;
  
            document.write("Yes " + Math.round(days));
        }
    }
 
// Driver Code
        let S = 10, N = 16, M = 2;
        survival(S, N, M);
         
        // This code is contributed by splevel62.
</script>

Producción: 

Yes 2

Complejidad de tiempo: O(1) 
Complejidad de espacio: O(1) 

Otro enfoque:

Verifique si la comida requerida para los días S se puede comprar o no, excluyendo los domingos y tomando todos los demás días para comprar. Si se puede comprar, compre con avidez desde el día inicial hasta que los alimentos adquiridos sean mayores o iguales a los alimentos requeridos para S días.

C++

// C++ program to find the minimum days on which
// you need to buy food from the shop so that you
// can survive the next S days
#include <bits/stdc++.h>
using namespace std;
 
// function to find the minimum days
int minimumDays(int S, int N, int M)
{
 
    // Food required to survive S days
    double req = S * M;
 
    // If buying all possible days except sundays, but can't
    // provide the sufficient food. If total can't provide
    // then each week also can't provide.
    if ((S - S / 7) * N < req) {
        return -1;
    } // If possible get the number of days.
    else {
        return ceil(req / N);
    }
 
    // Or Simply one line code:
    // return ((S-S/7)*N<S*M) ? -1 : ceil(static_cast<double>(S*M)/N);
}
 
// Driver code
int main()
{
    int S = 10, N = 16, M = 2;
 
    int days = minimumDays(S, N, M);
    if (days != -1) {
        cout << "Yes " << days << endl;
    }
    else {
        cout << "No" << endl;
    }
 
    return 0;
}

Producción:

Yes 2

Complejidad de tiempo: O(1) 
Complejidad de espacio: O(1) 

Publicación traducida automáticamente

Artículo escrito por Gautam Karakoti 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 *