Максимальное увеличение количества работ, которые могут быть выполнены при заданном ограничении
Учитывая целое число N, обозначающее количество заданий, и матрицу range [], состоящую из диапазона [день начала, день окончания] для каждого задания, в рамках которого оно должно быть выполнено, задача состоит в том, чтобы найти максимально возможные задания, которые могут быть выполнены.
Примеры:
Input: N = 5, Ranges = {{1, 5}, {1, 5}, {1, 5}, {2, 3}, {2, 3}}
Output: 5
Explanation: Job 1 on day 1, Job 4 on day 2, Job 5 on day 3, Job 2 on day 4, Job 3 on day 5Input: N=6, Ranges = {{1, 3}, {1, 3}, {2, 3}, {2, 3}, {1, 4}, {2, 5}}
Output: 5
Подход: указанная выше проблема может быть решена с помощью очереди приоритетов. Следуйте инструкциям ниже, чтобы решить проблемы:
- Найдите минимальный и максимальный день в ассортименте вакансий.
- Отсортируйте все задания в порядке возрастания дня начала .
- Итерируйте от минимального к максимальному дню и для каждого i- го дня выберите задание с наименьшим днем окончания, которое может быть выполнено в этот день.
- Для выполнения вышеуказанного шага поддерживайте минимальную кучу и каждый i- й день вставляйте задания, которые могут быть выполнены в этот день, в минимальную кучу, отсортированную по дню окончания . Если какое-либо задание может быть завершено в i- й день, рассмотрите задание с самым низким днем завершения и увеличьте количество выполненных заданий.
- Повторите этот процесс для всех дней и, наконец, распечатайте количество выполненных заданий.
Ниже представлена реализация описанного выше подхода:
C ++
// C++ Program to implement the // above approach #include <bits/stdc++.h> using namespace std; // Function to find maxiumum // number of jobs int find_maximum_jobs( int N, vector<pair< int , int > > ranges) { // Min Heap priority_queue< int , vector< int >, greater< int > > queue; // Sort ranges by start day sort(ranges.begin(), ranges.end()); // Stores the minimum and maximum // day in the ranges int min_day = ranges[0].first; int max_day = 0; for ( int i = 0; i < N; i++) max_day = max(max_day, ranges[i].second); int index = 0, count_jobs = 0; // Iterating from min_day to max_day for ( int i = min_day; i <= max_day; i++) { // Insert the end day of the jobs // which can be completed on // i-th day in a priority queue while (index < ranges.size() && ranges[index].first <= i) { queue.push(ranges[index].second); index++; } // Pop all jobs whose end day // is less than current day while (!queue.empty() && queue.top() < i) queue.pop(); // If queue is empty, no job // can be completed on // the i-th day if (queue.empty()) continue ; // Increment the count of // jobs completed count_jobs++; // Pop the job with // least end day queue.pop(); } // Return the jobs // on the last day return count_jobs; } // Driver Code int main() { int N = 5; vector<pair< int , int > > ranges; ranges.push_back({ 1, 5 }); ranges.push_back({ 1, 5 }); ranges.push_back({ 1, 5 }); ranges.push_back({ 2, 3 }); ranges.push_back({ 2, 3 }); cout << find_maximum_jobs(N, ranges); } |
Джава
// Java Program to implement the // above approach import java.io.*; import java.util.*; class GFG { // Function to find maxiumum // number of jobs static int find_maximum_jobs( int N, ArrayList<ArrayList<Integer>> ranges) { // Min Heap ArrayList<Integer> queue = new ArrayList<Integer>(); // Sort ranges by start day Collections.sort(ranges, new Comparator<ArrayList<Integer>>() { @Override public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) { return o1.get( 0 ).compareTo(o2.get( 0 )); } }); // Stores the minimum and maximum // day in the ranges int min_day = ranges.get( 0 ).get( 0 ); int max_day = 0 ; for ( int i = 0 ; i < N; i++) max_day = Math.max(max_day, ranges.get(i).get( 1 )); int index = 0 , count_jobs = 0 ; // Iterating from min_day to max_day for ( int i = min_day; i <= max_day; i++) { // Insert the end day of the jobs // which can be completed on // i-th day in a priority queue while (index < ranges.size() && ranges.get(index).get( 0 ) <= i) { queue.add(ranges.get(index).get( 1 )); index++; } Collections.sort(queue); // Pop all jobs whose end day // is less than current day while (queue.size() > 0 && queue.get( 0 ) < i) queue.remove( 0 ); // If queue is empty, no job // can be completed on // the i-th day if (queue.size() == 0 ) continue ; // Increment the count of // jobs completed count_jobs++; // Pop the job with // least end day queue.remove( 0 ); } // Return the jobs // on the last day return count_jobs; } // Driver code public static void main (String[] args) { int N = 5 ; ArrayList<ArrayList<Integer>> ranges = new ArrayList<ArrayList<Integer>>(); ranges.add( new ArrayList<Integer>(Arrays.asList( 1 , 5 ))); ranges.add( new ArrayList<Integer>(Arrays.asList( 1 , 5 ))); ranges.add( new ArrayList<Integer>(Arrays.asList( 1 , 5 ))); ranges.add( new ArrayList<Integer>(Arrays.asList( 2 , 3 ))); ranges.add( new ArrayList<Integer>(Arrays.asList( 2 , 3 ))); System.out.println(find_maximum_jobs(N, ranges)); } } // This code is contributed by avanitrachhadiya2155 |
Python3
# Python3 Program to implement the # above approach # Function to find maxiumum # number of jobs def find_maximum_jobs(N, ranges) : # Min Heap queue = [] # Sort ranges by start day ranges.sort() # Stores the minimum and maximum # day in the ranges min_day = ranges[ 0 ][ 0 ] max_day = 0 for i in range (N) : max_day = max (max_day, ranges[i][ 1 ]) index, count_jobs = 0 , 0 # Iterating from min_day to max_day for i in range (min_day, max_day + 1 ) : # Insert the end day of the jobs # which can be completed on # i-th day in a priority queue while (index < len (ranges) and ranges[index][ 0 ] < = i) : queue.append(ranges[index][ 1 ]) index + = 1 queue.sort() # Pop all jobs whose end day # is less than current day while ( len (queue) > 0 and queue[ 0 ] < i) : queue.pop( 0 ) # If queue is empty, no job # can be completed on # the i-th day if ( len (queue) = = 0 ) : continue # Increment the count of # jobs completed count_jobs + = 1 # Pop the job with # least end day queue.pop( 0 ) # Return the jobs # on the last day return count_jobs # Driver code N = 5 ranges = [] ranges.append(( 1 , 5 )) ranges.append(( 1 , 5 )) ranges.append(( 1 , 5 )) ranges.append(( 2 , 3 )) ranges.append(( 2 , 3 )) print (find_maximum_jobs(N, ranges)) # This code is contributed by divyeshrabadiya07. |
C #
// C# Program to implement the // above approach using System; using System.Collections.Generic; class GFG { // Function to find maxiumum // number of jobs static int find_maximum_jobs( int N, List<Tuple< int , int >> ranges) { // Min Heap List< int > queue = new List< int >(); // Sort ranges by start day ranges.Sort(); // Stores the minimum and maximum // day in the ranges int min_day = ranges[0].Item1; int max_day = 0; for ( int i = 0; i < N; i++) max_day = Math.Max(max_day, ranges[i].Item2); int index = 0, count_jobs = 0; // Iterating from min_day to max_day for ( int i = min_day; i <= max_day; i++) { // Insert the end day of the jobs // which can be completed on // i-th day in a priority queue while (index < ranges.Count && ranges[index].Item1 <= i) { queue.Add(ranges[index].Item2); index++; } queue.Sort(); // Pop all jobs whose end day // is less than current day while (queue.Count > 0 && queue[0] < i) queue.RemoveAt(0); // If queue is empty, no job // can be completed on // the i-th day if (queue.Count == 0) continue ; // Increment the count of // jobs completed count_jobs++; // Pop the job with // least end day queue.RemoveAt(0); } // Return the jobs // on the last day return count_jobs; } // Driver code static void Main() { int N = 5; List<Tuple< int , int >> ranges = new List<Tuple< int , int >>(); ranges.Add( new Tuple< int , int >(1, 5)); ranges.Add( new Tuple< int , int >(1, 5)); ranges.Add( new Tuple< int , int >(1, 5)); ranges.Add( new Tuple< int , int >(2, 3)); ranges.Add( new Tuple< int , int >(2, 3)); Console.Write(find_maximum_jobs(N, ranges)); } } // This code is contributed by divyesh072019. |
5
Сложность времени: O (Xlog (N)), где X - разница между максимальным и минимальным днем, а N - количество заданий.
Вспомогательное пространство: O (N 2 )
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по доступной для студентов цене и будьте готовы к работе в отрасли. Получите все важные математические концепции для соревновательного программирования с курсом Essential Maths for CP по доступной для студентов цене.
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.