Problema de secuenciación de trabajos | Conjunto 3 (usando TreeSet en JAVA)

Dada una serie de trabajos donde cada trabajo tiene una fecha límite y una ganancia asociada (si el trabajo se termina antes de la fecha límite). También se da que cada trabajo requiere una sola unidad de tiempo, por lo que la fecha límite mínima posible para cualquier trabajo es 1. Cómo maximizar la ganancia total si solo se puede programar un trabajo a la vez.

Ejemplos:

Input : Four Jobs with following deadlines and profits
  JobID    Deadline      Profit
    a        4            20   
    b        1            10
    c        1            40  
    d        1            30
Output : Following is maximum profit sequence of jobs
         c, a 
Input : Five Jobs with following deadlines and profits
   JobID     Deadline     Profit
     a         2           100
     b         1           19
     c         2           27
     d         1           25
     e         3           15
Output : Following is maximum profit sequence of jobs
         c, a, e

A continuación se muestra el algoritmo paso a paso para resolver el problema usando TreeSet en Java:

  1. Ordena todos los trabajos según sus respectivas ganancias en orden decreciente.
  2. Cree un TreeSet e inserte todos los enteros de 0 a n-1.
  3. Atraviesa la array de trabajos y para i -ésimo trabajo
    • Busque un intervalo de tiempo ‘x’ en el TreeSet con un valor máximo que sea menor que la fecha límite del i -ésimo trabajo.
    • Si existe algún valor, incluya ese trabajo en la respuesta y elimine ‘x’ del TreeSet
    • De lo contrario, verifique los trabajos restantes.

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

import java.io.*;
import java.util.*;
  
public class Solution {
      
    // Job class
    public static class Job {
        char id;
        int deadline;
        int profit;
  
        // Constructor
        Job(char id, int deadline, int profit)
        {
            this.id = id;
            this.deadline = deadline;
            this.profit = profit;
        }
    }
  
    public static class Sorted implements Comparator {
          
        // Function to implement comparator
        public int compare(Object o1, Object o2)
        {
            Job j1 = (Job)o1;
            Job j2 = (Job)o2;
  
            if (j1.profit != j2.profit)
                return j2.profit - j1.profit;
            else
                return j2.deadline - j1.deadline;
        }
    }
      
    // Function to print job scheduling
    public static void printJobScheduling(Job jobs[], int n)
    {
        // Creating object of Sorted class
        Sorted sorter = new Sorted();
          
        Arrays.sort(jobs, sorter);
      
        // Creating TreeSet Object
        TreeSet<Integer> ts = new TreeSet<>();
  
        for (int i = 0; i < n; i++)
            ts.add(i);
  
        for (int i = 0; i < n; i++) {
            Integer x = ts.floor(jobs[i].deadline - 1);
  
            if (x != null) {
                System.out.print(jobs[i].id + " ");
                ts.remove(x);
            }
        }
    }
      
    // Driver Code
    public static void main(String[] args)
    {
        int n = 5;
        Job[] jobs = new Job[n];
  
        jobs[0] = new Job('a', 2, 100);
        jobs[1] = new Job('b', 1, 19);
        jobs[2] = new Job('c', 2, 27);
        jobs[3] = new Job('d', 1, 25);
        jobs[4] = new Job('e', 3, 15);
  
        printJobScheduling(jobs, n);
    }
    // Contributed by Dipesh Jain (dipesh_jain)
}

Complejidad de tiempo : O(N*log(N))
Espacio auxiliar : O(N)

Publicación traducida automáticamente

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