Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में जॉब शेड्यूल की न्यूनतम कठिनाई

मान लीजिए हम कार्यों की एक सूची को d दिनों में शेड्यूल करना चाहते हैं। कार्य निर्भर हैं इसलिए, i-वें कार्य पर काम करने के लिए, हमें उन सभी कार्यों j को पूरा करना होगा जहां 0 <= j < i।

हमें प्रत्येक दिन कम से कम एक कार्य पूरा करना होगा। एक कार्य शेड्यूल की कठिनाई वास्तव में d दिनों में से प्रत्येक दिन की कठिनाइयों का योग है। एक दिन की कठिनाई उस दिन किए गए कार्य की अधिकतम कठिनाई है।

इसलिए हमारे पास taskDifficulty नामक पूर्णांकों की एक सरणी और एक पूर्णांक d है। i-वें कार्य की कठिनाई taskDifficulty[i] है। हमें कार्य शेड्यूल की न्यूनतम कठिनाई ज्ञात करनी है। यदि हम कार्यों के लिए शेड्यूल नहीं ढूंढ सकते, तो -1 लौटाएं।

यदि इनपुट taskDifficulty = [6,5,4,3,2,1], d = 2 है, तो आउटपुट 7 होगा, क्योंकि दिन 1 पर हम पहले 5 कार्य पूरे कर सकते हैं, कुल कठिनाई 6 है। अब दिन 2 पर हम अंतिम कार्य पूरा कर सकते हैं, कुल कठिनाई 1 है, इसलिए शेड्यूल की कठिनाई 6 + 1 = 7 होगी।

हल करने के चरण

  • solve() फ़ंक्शन परिभाषित करें जो सरणी v, idx, k, 2D dp लेता है

  • यदि idx == v.size() और k == 0 तो 0 लौटाएं

  • यदि k < 0 या idx == v.size() और k > 0 तो INF लौटाएं

  • यदि dp[idx][k] != -1 तो dp[idx][k] लौटाएं

  • maxVal := 0, ret := INF

  • idx से v.size()-1 तक: maxVal = max(v[i], maxVal), ret = min(ret, maxVal + solve(v, i+1, k-1, dp))

  • dp[idx][k] := ret, ret लौटाएं

  • मुख्य विधि से: n := j का आकार, यदि d > n तो -1 लौटाएं, dp आरंभ करें, solve(j, 0, d, dp) लौटाएं

उदाहरण

#include <bits/stdc++.h> 
using namespace std; 

class Solution { 
public: 
    int solve(vector<int>& v, int idx, int k, vector<vector<int> >& dp) { 
        if (idx == v.size() && k == 0) return 0; 
        if (k < 0 || (idx == v.size() && k > 0)) return 1e6; 
        if (dp[idx][k] != -1) return dp[idx][k]; 
        int maxVal = 0; 
        int ret = INT_MAX; 
        for (int i = idx; i < v.size(); i++) { 
            maxVal = max(v[i], maxVal); 
            ret = min(ret, maxVal + solve(v, i + 1, k - 1, dp)); 
        } 
        return dp[idx][k] = ret; 
    } 
    int minDifficulty(vector<int>& j, int d) { 
        int n = j.size(); 
        if (d > n) return -1; 
        vector<vector<int> > dp(n, vector<int>(d + 1, -1)); 
        return solve(j, 0, d, dp); 
    } 
}; 

int main() { 
    Solution ob; 
    vector<int> v = {6,5,4,3,2,1}; 
    cout << (ob.minDifficulty(v, 2)); 
    return 0; 
}

इनपुट

{6,5,4,3,2,1}, 2

आउटपुट

7
  1. - C++ में न्यूनतम स्ट्रिंग परिवर्तन

    मान लीजिए हमारे पास समान लंबाई की दो स्ट्रिंग्स s और t हैं, और दोनों लोअरकेस अक्षरों में हैं। पहले हम s को किसी भी क्रम में पुनर्व्यवस्थित करते हैं, फिर s को t में बदलने के लिए आवश्यक न्यूनतम परिवर्तनों की संख्या गिनते हैं। उदाहरण के लिए, यदि इनपुट है s = eccynue, t = science, तो आउटपुट 2 होगा। यद

  1. - C++ में टीवी शो अवधि गणना

    मान लीजिए हमारे पास टीवी शो की एक सूची है, और दूसरी सूची अवधि की है, और एक पूर्णांक k है। यहाँ shows[i] और duration[i] i-वें व्यक्ति द्वारा देखे गए शो का नाम और अवधि दर्शाते हैं। हमें k सबसे अधिक देखे गए शो की कुल अवधि ज्ञात करनी है। उदाहरण के लिए, यदि इनपुट है: shows: [Castle Play, Fairy Tale Ser

  1. C++ में जॉब शेड्यूलिंग में अधिकतम लाभ (Maximum Profit in Job Scheduling) C++ में जॉब शेड्यूलिंग में अधिकतम लाभ (Maximum Profit in Job Scheduling)

    समस्या विवरण n अलग-अलग कार्य दिए गए हैं। प्रत्येक कार्य startTime[i] से endTime[i] तक चलता है और profit[i] लाभ देता है। हमें ऐसे कार्यों का सबसेट चुनना है जिनके समय ओवरलैप न हों, ताकि कुल लाभ अधिकतम हो। यदि एक कार्य समय X पर समाप्त होता है, तो दूसरा कार्य समय X पर शुरू हो सकता है। उदाहरण इनपुट sta