Número mínimo de días para depurar todos los programas

Dados N códigos de programa y sus respectivos tiempos de depuración en una array codeTime y un número entero WorkingSessionTime, el iésimo programa tarda codeTime[i] horas en finalizar. WorkingSessionTime define un umbral de tiempo, usted trabaja como máximo durante WorkingSessionTime horas consecutivas y luego toma un descanso. Si WorkingSessionTime es inferior a 6 horas, entonces se pueden tomar 2 sesiones de trabajo por día; de lo contrario, solo se puede tomar una sesión de trabajo por día.

La depuración debe finalizar siguiendo las siguientes condiciones:

  • Se debe completar una secuencia de depuración en la misma sesión (en cualquier orden).
  • La nueva tarea de depuración se puede iniciar inmediatamente después de finalizar la anterior.

La tarea es imprimir el número mínimo de días necesarios para depurar todos los programas siguiendo las condiciones anteriores. Suponga que WorkingSessionTime es mayor o igual que el elemento máximo en la array codeTime . 

Ejemplos :

Entrada : codeTime[] = {1, 2, 3}, WorkingSessionTime = 3
Salida : 1
Explicación : en la primera sesión de trabajo, terminaremos la primera y la segunda tarea en 1+2 = 3 horas y podemos terminar la última tarea en la segunda sesión de trabajo , por lo que el total de 2 sesiones de trabajo necesarias para finalizar la tarea. WorkingSessionTime es inferior a 6, por lo que podemos tomar dos sesiones por día, por lo que el número mínimo de días será 1

Entrada : codeTime [] = {1, 2, 3, 1, 1, 3}, WorkingSessionTime = 4
Salida : 2
Explicación : en la primera sesión de trabajo, terminaremos la primera y la tercera tarea en 1+3 = 4 horas y en la segunda sesión podemos terminar la cuarta y sexta tarea en 1+3 = 4 horas y en la tercera sesión podemos terminar la segunda y quinta tarea 2 + 1 = 3 horas. WorkingSessionTime es menos de 6, por lo que podemos tomar dos sesiones por día. El primer día haremos dos sesiones de trabajo y al día siguiente haremos una sesión de trabajo. Entonces, el número mínimo de días requeridos es 2

 

Enfoque:   una solución simple es probar todos los órdenes posibles de tareas. Comience seleccionando el primer elemento de la array, marcándolo como visitado y repita las tareas restantes y descubra las sesiones mínimas entre todos los pedidos posibles. Es básicamente una solución basada en el seguimiento. Después de encontrar un número mínimo de sesiones, comprobaremos si las horas de trabajo de la sesión son inferiores a 6 o no. Si es inferior a 6, comprobaremos además que ninguna de las sesiones mínimas es par o impar. 
 

Enfoque óptimo : una mejor solución es utilizar Bitmasking y DP

La idea es usar el hecho de que hay hasta 14 tareas, por lo que podemos usar una variable entera como máscara para indicar qué elementos se procesan . si el i-ésimo bit está apagado , significa que la tarea i-ésima aún no se ha procesado con el tiempo restante que tenemos para la sesión actual. Si se establece el bit i-ésimo , significa que se procesa la tarea de depuración del código de programa i-ésimo.

  • Inicialice la máscara como 000…000, que representa los estados iniciales (sin procesar) de todos los elementos.
  • Pase el tiempo restante como 0, lo que significa que no hay tiempo restante para la sesión actual y tenemos que crear una nueva sesión.
  • Compruebe si el i-ésimo bit está procesado o no, realice llamadas si la tarea no está procesada . si la tarea de depuración del código del programa no está procesada, márquela como procesada.
  • Si el tiempo restante es mayor que CodeTime[i], incluiremos una tarea de depuración del código del programa en la sesión actual y actualizaremos el tiempo restante; de ​​lo contrario, tendremos que crear una nueva sesión y aumentar el número de sesiones en 1.
  • Una vez que se procesan todos los elementos o la máscara se convierte en 1, obtendremos el mínimo de sesiones posibles.
  • Si el tiempo de sesión de trabajo es inferior a 6, comprobaremos además que el número mínimo de sesiones posibles es par o impar, si el número mínimo de días pares será la mitad del número mínimo de sesiones y si es el número mínimo de días impares. la mitad del número mínimo de sesiones +1, en caso contrario será igual un número mínimo de días para contestar.

Para lidiar con los subproblemas superpuestos, cree una tabla DP 2D para almacenar las respuestas de los subproblemas . Para cada elemento dp[i][j], i es la máscara y j es el tiempo restante.

A continuación se muestra la implementación del enfoque anterior:

C++14

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate
// the minimum work sessions
int minSessions(vector<int>& codeTime,
                vector<vector<int> >& dp,
                int ones, int n,
                int mask, int currTime,
                int WorkingSessionTime)
{
    // Break condition
    if (currTime > WorkingSessionTime)
        return INT_MAX;
 
    // All bits are set
    if (mask == ones)
        return 1;
 
    // Check if already calculated
    if (dp[mask][currTime] != -1)
        return dp[mask][currTime];
 
    // Store the answer
    int ans = INT_MAX;
    for (int i = 0; i < n; i++) {
        // Check if ith bit is set or unset
        if ((mask & (1 << i)) == 0) {
 
            // Including in current work session
            int inc = minSessions(
                codeTime, dp, ones,
                n, mask | (1 << i),
                currTime + codeTime[i],
                WorkingSessionTime);
 
            // Including in next work session
            int inc_next
                = 1
                  + minSessions(
                        codeTime, dp, ones, n,
                        mask | (1 << i), codeTime[i],
                        WorkingSessionTime);
 
            // Resultant answer will be minimum of both
            ans = min({ ans, inc, inc_next });
        }
    }
    return dp[mask][currTime] = ans;
}
 
// Function to initialize DP array
// and solve the problem
int solve(vector<int> codeTime, int n,
          int WorkingSessionTime)
{
 
    // Initialize dp table with -1
    vector<vector<int> > dp((1 << 14),
                            vector<int>(15, -1));
 
    // Resultant mask
    int ones = (1 << n) - 1;
 
    int ans = minSessions(codeTime, dp,
                          ones, n, 0, 0,
                          WorkingSessionTime);
 
    // no. of minimum work sessions is even
    if (WorkingSessionTime < 6) {
        if (ans % 2 == 0)
            ans = ans / 2;
 
        // no. of minimum work sessions is odd
        else
            ans = (ans / 2) + 1;
    }
 
    return ans;
}
 
// Driver code
int main()
{
    vector<int> codeTime = { 1, 2, 3, 1, 1, 3 };
    int n = codeTime.size();
 
    int WorkingSessionTime = 4;
 
    cout
        << solve(codeTime, n, WorkingSessionTime)
        << endl;
    return 0;
}

Java

// Java program for the above approach
import java.util.Arrays;
 
class GFG
{
 
    // Function to calculate
    // the minimum work sessions
    public static int minSessions(int[] codeTime, int[][] dp,
                                  int ones, int n, int mask,
                                  int currTime,
                                  int WorkingSessionTime)
     
    {
        // Break condition
        if (currTime > WorkingSessionTime)
            return Integer.MAX_VALUE;
 
        // All bits are set
        if (mask == ones)
            return 1;
 
        // Check if already calculated
        if (dp[mask][currTime] != -1)
            return dp[mask][currTime];
 
        // Store the answer
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            // Check if ith bit is set or unset
            if ((mask & (1 << i)) == 0) {
 
                // Including in current work session
                int inc = minSessions(codeTime, dp, ones, n,
                                      mask | (1 << i), currTime +
                                      codeTime[i], WorkingSessionTime);
 
                // Including in next work session
                int inc_next = 1 + minSessions(codeTime, dp,
                                               ones, n, mask | (1 << i),
                                               codeTime[i], WorkingSessionTime);
 
                // Resultant answer will be minimum of both
                ans = Math.min(ans, Math.min(inc, inc_next));
            }
        }
        return dp[mask][currTime] = ans;
    }
 
    // Function to initialize DP array
    // and solve the problem
    public static int solve(int[] codeTime, int n,
                            int WorkingSessionTime)
    {
 
        // Initialize dp table with -1
        int[][] dp = new int[(1 << 14)][];
 
        for (int i = 0; i < 1 << 14; i++) {
            dp[i] = new int[15];
            Arrays.fill(dp[i], -1);
        }
       
        // Resultant mask
        int ones = (1 << n) - 1;
        int ans = minSessions(codeTime, dp,
                              ones, n, 0, 0,
                              WorkingSessionTime);
 
        // no. of minimum work sessions is even
        if (WorkingSessionTime < 6)
        {
            if (ans % 2 == 0)
                ans = ans / 2;
 
            // no. of minimum work sessions is odd
            else
                ans = (ans / 2) + 1;
        }
 
        return ans;
    }
 
    // Driver code
    public static void main(String args[]) {
        int[] codeTime = { 1, 2, 3, 1, 1, 3 };
        int n = codeTime.length;
 
        int WorkingSessionTime = 4;
 
        System.out.println(solve(codeTime, n, WorkingSessionTime));
    }
}
 
// This code is contributed by saurabh_jaiswal.

Python3

# Python 3 program for the above approach
import sys
 
# Function to calculate
# the minimum work sessions
def minSessions(codeTime, dp, ones, n, mask, currTime, WorkingSessionTime):
   
    # Break condition
    if (currTime > WorkingSessionTime):
        return sys.maxsize
 
    # All bits are set
    if (mask == ones):
        return 1
 
    # Check if already calculated
    if (dp[mask][currTime] != -1):
        return dp[mask][currTime]
 
    # Store the answer
    ans = sys.maxsize
    for i in range(n):
       
        # Check if ith bit is set or unset
        if ((mask & (1 << i)) == 0):
 
            # Including in current work session
            inc = minSessions(codeTime, dp, ones, n, mask | (1 << i),currTime + codeTime[i],WorkingSessionTime)
 
            # Including in next work session
            inc_next = 1 + minSessions(codeTime, dp, ones, n,mask | (1 << i), codeTime[i],WorkingSessionTime)
 
            # Resultant answer will be minimum of both
            ans = min([ans, inc, inc_next])
    dp[mask][currTime] = ans
    return ans
 
# Function to initialize DP array
# and solve the problem
def solve(codeTime, n, WorkingSessionTime):
   
    # Initialize dp table with -1
    dp = [[-1 for i in range(15)] for j in range(1 << 14)]
 
    # Resultant mask
    ones = (1 << n) - 1
 
    ans = minSessions(codeTime, dp, ones, n, 0, 0, WorkingSessionTime)
 
    # no. of minimum work sessions is even
    if (WorkingSessionTime < 6):
        if (ans % 2 == 0):
            ans = ans // 2
 
        # no. of minimum work sessions is odd
        else:
            ans = (ans / 2) + 1
 
    return int(ans)
 
# Driver code
if __name__ == '__main__':
    codeTime = [1, 2, 3, 1, 1, 3]
    n = len(codeTime)
 
    WorkingSessionTime = 4
    print(solve(codeTime, n, WorkingSessionTime))
     
    # This code is contributed by SURENDRA_GANGWAR.

C#

// C# program for the above approach
using System;
public class GFG
{
     
      // Function to calculate
    // the minimum work sessions
    public static int minSessions(int[] codeTime, int[, ] dp,
                                  int ones, int n, int mask,
                                  int currTime,
                                  int WorkingSessionTime)
     
    {
       
        // Break condition
        if (currTime > WorkingSessionTime)
            return Int32.MaxValue;
 
        // All bits are set
        if (mask == ones)
            return 1;
 
        // Check if already calculated
        if (dp[mask, currTime] != -1)
            return dp[mask, currTime];
 
        // Store the answer
        int ans = Int32.MaxValue;
        for (int i = 0; i < n; i++) {
            // Check if ith bit is set or unset
            if ((mask & (1 << i)) == 0) {
 
                // Including in current work session
                int inc = minSessions(codeTime, dp, ones, n,
                                      mask | (1 << i), currTime +
                                      codeTime[i], WorkingSessionTime);
 
                // Including in next work session
                int inc_next = 1 + minSessions(codeTime, dp,
                                               ones, n, mask | (1 << i),
                                               codeTime[i], WorkingSessionTime);
 
                // Resultant answer will be minimum of both
                ans = Math.Min(ans, Math.Min(inc, inc_next));
            }
        }
        return dp[mask, currTime] = ans;
    }
 
    // Function to initialize DP array
    // and solve the problem
    public static int solve(int[] codeTime, int n,
                            int WorkingSessionTime)
    {
 
        // Initialize dp table with -1
        int[, ] dp = new int[(1 << 14), 15];
 
        for (int i = 0; i < 1 << 14; i++) {
           
            for(int j = 0; j < 15; j++) {
                  
              dp[i, j] = -1;
            }
        }
       
        // Resultant mask
        int ones = (1 << n) - 1;
        int ans = minSessions(codeTime, dp,
                              ones, n, 0, 0,
                              WorkingSessionTime);
 
        // no. of minimum work sessions is even
        if (WorkingSessionTime < 6)
        {
            if (ans % 2 == 0)
                ans = ans / 2;
 
            // no. of minimum work sessions is odd
            else
                ans = (ans / 2) + 1;
        }
 
        return ans;
    }
 
    // Driver code
    static public void Main (){
 
           int[] codeTime = { 1, 2, 3, 1, 1, 3 };
        int n = codeTime.Length;
        int WorkingSessionTime = 4;
        Console.WriteLine(solve(codeTime, n, WorkingSessionTime));
    }
}
 
// This code is contributed by Dharanendra L V.

Javascript

<script>
       // JavaScript Program to implement
       // the above approach
 
       // Function to calculate
       // the minimum work sessions
       function minSessions(codeTime,
           dp, ones, n, mask, currTime,
           WorkingSessionTime)
       {
        
           // Break condition
           if (currTime > WorkingSessionTime)
               return Number.MAX_VALUE;
 
           // All bits are set
           if (mask == ones)
               return 1;
 
           // Check if already calculated
           if (dp[mask][currTime] != -1)
               return dp[mask][currTime];
 
           // Store the answer
           let ans = Number.MAX_VALUE;
           for (let i = 0; i < n; i++)
           {
            
               // Check if ith bit is set or unset
               if ((mask & (1 << i)) == 0)
               {
 
                   // Including in current work session
                   let inc = minSessions(
                       codeTime, dp, ones,
                       n, mask | (1 << i),
                       currTime + codeTime[i],
                       WorkingSessionTime);
 
                   // Including in next work session
                   let inc_next = 1 + minSessions(
                           codeTime, dp, ones, n,
                           mask | (1 << i), codeTime[i],
                           WorkingSessionTime);
 
                   // Resultant answer will be minimum of both
                   ans = Math.min(ans, Math.min(inc, inc_next));
               }
           }
           return dp[mask][currTime] = ans;
       }
 
       // Function to initialize DP array
       // and solve the problem
       function solve(codeTime, n,
           WorkingSessionTime) {
 
           // Initialize dp table with -1
           let dp = new Array(1 << 14);
 
           for (let i = 0; i < dp.length; i++) {
               dp[i] = new Array(15).fill(-1);
           }
 
 
           // Resultant mask
           let ones = (1 << n) - 1;
 
           let ans = minSessions(codeTime, dp,
               ones, n, 0, 0,
               WorkingSessionTime);
 
           // no. of minimum work sessions is even
           if (WorkingSessionTime < 6) {
               if (ans % 2 == 0)
                   ans = Math.floor(ans / 2);
 
               // no. of minimum work sessions is odd
               else
                   ans = Math.floor(ans / 2) + 1;
           }
 
           return ans;
       }
 
       // Driver code
       let codeTime = [1, 2, 3, 1, 1, 3];
       let n = codeTime.length;
 
       let WorkingSessionTime = 4;
 
       document.write(
           solve(codeTime, n, WorkingSessionTime))
 
    // This code is contributed by Potta Lokesh
 
   </script>
Producción: 

2

 

 Complejidad de tiempo : O (2 ^ N * WorkingSessionTime * N), aquí N es la longitud de la array codeTime.
Espacio auxiliar : O(2^N * WorkingSessionTime), tamaño de la tabla dp.

Publicación traducida automáticamente

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