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

C++ में टिकटों के लिए न्यूनतम लागत


मान लीजिए एक देश है जो ट्रेन यात्रा के लिए प्रसिद्ध है। हमने एक साल पहले ही कुछ ट्रेन यात्राओं की योजना बनाई है। हमारे पास एक सरणी है जिसमें उन दिनों की सूची है जब हम यात्रा करेंगे। प्रत्येक दिन 1 से 365 तक का एक पूर्णांक है। ट्रेन टिकट तीन तरीकों से बेचे जाते हैं:

  • 1-दिन का पास costs[0] डॉलर में;
  • 7-दिन का पास costs[1] डॉलर में;
  • 30-दिन का पास costs[2] डॉलर में।

ये पास लगातार उतने दिनों की यात्रा की अनुमति देते हैं। उदाहरण के लिए, यदि हम दिन 2 पर 7-दिन का पास लेते हैं, तो हम लगातार 7 दिनों (2, 3, 4, 5, 6, 7, 8) तक यात्रा कर सकते हैं। हमें दिए गए दिनों की सूची में हर दिन यात्रा करने के लिए आवश्यक न्यूनतम डॉलर खोजने हैं।

उदाहरण: इनपुट days = [1,4,6,7,8,20] और costs = [2,7,15] हो, तो आउटपुट 11 होगा।

व्याख्या: दिन 1 पर 1-दिन का पास ($2), दिन 3 पर 7-दिन का पास ($7, दिन 3-9 कवर करता है), दिन 20 पर फिर 1-दिन का पास ($2)। कुल = $11।

डायनामिक प्रोग्रामिंग समाधान

  1. dp नामक एक सरणी बनाएँ जिसका आकार 366 हो (दिन 1 से 365 तक)।
  2. j := 0 (days सरणी के लिए इंडेक्स)।
  3. i = 1 से 365 तक लूप चलाएँ:
    • dp[i] = costs[0] + dp[i-1] (1-दिन का पास खरीदें)।
    • यदि i-7 ≥ 0, तो dp[i] = min(dp[i], dp[i-7] + costs[1]) (7-दिन का पास)।
    • यदि i-30 ≥ 0, तो dp[i] = min(dp[i], dp[i-30] + costs[2]) (30-दिन का पास)।
    • यदि j < days.size() और days[j] == i, तो j++ (आज यात्रा का दिन है)।
    • अन्यथा dp[i] = min(dp[i], dp[i-1]) (आज यात्रा नहीं, कल की लागत आगे बढ़ाएँ)।
  4. dp[365] लौटाएँ।

C++ कार्यान्वयन

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

class Solution {
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
        vector<int> dp(366, 0);
        int j = 0;
        for (int i = 1; i < 366; i++) {
            dp[i] = costs[0] + dp[i - 1];
            if (i - 7 >= 0) dp[i] = min(dp[i], dp[i - 7] + costs[1]);
            if (i - 30 >= 0) dp[i] = min(dp[i], dp[i - 30] + costs[2]);
            if (j < days.size() && days[j] == i) {
                j++;
            } else {
                dp[i] = min(dp[i], dp[i - 1]);
            }
        }
        return dp[365];
    }
};

int main() {
    vector<int> days = {1,4,6,7,8,20};
    vector<int> costs = {2,7,15};
    Solution ob;
    cout << ob.mincostTickets(days, costs); // आउटपुट: 11
    return 0;
}

इनपुट

[1,4,6,7,8,20] [2,7,15]

आउटपुट

11
  1. C++ में कार्टेशियन निर्देशांकों को जोड़ने की न्यूनतम लागत ज्ञात करने का प्रोग्राम C++ में कार्टेशियन निर्देशांकों को जोड़ने की न्यूनतम लागत ज्ञात करने का प्रोग्राम

    मान लीजिए हमारे पास 2D कार्टेशियन निर्देशांक बिंदुओं (x, y) की एक सूची है। हम (x0, y0) और (x1, y1) को जोड़ सकते हैं, जिसकी लागत |x0 - x1| + |y0 - y1| है। यदि हमें किसी भी संख्या में बिंदुओं को जोड़ने की अनुमति है, तो हमें वह न्यूनतम लागत ज्ञात करनी होगी जिससे हर बिंदु एक पथ से जुड़ा हो।उदाहरण के लिए

  1. C++ में बोर्ड को वर्गों में काटने की न्यूनतम लागत C++ में बोर्ड को वर्गों में काटने की न्यूनतम लागत

    अवधारणा मान लीजिए लंबाई p और चौड़ाई q का एक बोर्ड दिया गया है, हमें इस बोर्ड को p*q वर्गों में तोड़ना है ताकि तोड़ने की लागत न्यूनतम हो। इस बोर्ड के लिए, प्रत्येक किनारे के लिए काटने की लागत दी जाएगी। संक्षेप में, हमें काटने का ऐसा क्रम चुनना है जिससे लागत न्यूनतम हो। उदाहरण उपरोक्त बोर्ड को वर्गो

  1. C++ में न्यूनतम नाइट मूव्स C++ में न्यूनतम नाइट मूव्स

    मान लीजिए हमारे पास एक अनंत शतरंज बोर्ड है जिसके कोऑर्डिनेट्स -इनफिनिटी से +इनफिनिटी तक हैं, और हमारे पास [0, 0] स्क्वायर पर एक नाइट है। नाइट के 8 संभावित मूव्स होते हैं, जैसा कि नीचे दिखाया गया है। प्रत्येक मूव कार्डिनल डायरेक्शन में दो स्क्वायर, फिर ऑर्थोगोनल डायरेक्शन में एक स्क्वायर होता है। ह