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

C++ . में सिक्का पथ

मान लीजिए कि हमारे पास एन संख्याओं के साथ एक सरणी ए (सूचकांक 1 से शुरू होता है:ए 1, ए 2, ..., एएन और एक अन्य पूर्णांक बी। पूर्णांक बी दर्शाता है कि किसी भी इंडेक्स से सरणी ए में है, हम किसी भी पर जा सकते हैं सरणी में एक स्थान A अनुक्रमित i+1, i+2,…, i+B यदि इस स्थान पर छलांग लगाई जा सकती है। इसके अलावा, यदि हम सूचकांक i पर कदम रखते हैं, तो हमें एआई राशि के सिक्कों का भुगतान करना होगा। अगर एआई -1 है, तो इसका मतलब है कि हम एरे में इंडेक्स किए गए स्थान पर नहीं जा सकते।

अब, जब हम एरे ए में अनुक्रमित 1 स्थान से शुरू करते हैं, और हमारा उद्देश्य न्यूनतम सिक्कों का उपयोग करके अनुक्रमित एन स्थान तक पहुंचना है। हमें न्यूनतम सिक्कों का उपयोग करके अनुक्रमित एन के स्थान पर पहुंचने के लिए हमें जिस सरणी में ले जाना चाहिए, उसमें अनुक्रमित का पथ (1 से एन तक) वापस करना होगा। यदि हमारे पास एक ही लागत के साथ कई पथ हैं, तो हमें शब्दकोष की दृष्टि से सबसे छोटा ऐसा पथ खोजना होगा। और अगर हमारे पास अनुक्रमित एन स्थान तक पहुंचने के लिए ऐसा कोई संभावित मार्ग नहीं है तो हम एक खाली सरणी वापस कर देंगे।

इसलिए, यदि इनपुट [1,2,4,-1,2], 2 जैसा है, तो आउटपुट [1,3,5]

होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • n :=A का आकार

  • एक सरणी रिट परिभाषित करें

  • आकार n की एक सरणी लागत को परिभाषित करें, और इसे inf से भरें

  • आकार n के आगे एक सरणी परिभाषित करें, और इसे -1 से भरें

  • यदि नहीं n गैर-शून्य है या A[n - 1] -1 के समान है, तो -

    • समापन बिंदु :=n - 1

  • लागत [एन - 1] =ए [एन -1]

  • इनिशियलाइज़ करने के लिए i :=n - 2, जब i>=0, अपडेट करें (i से 1 घटाएं), −

    करें
    • अगर A[i] -1 के समान है, तो -

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • j की श्रेणी में i + 1 से न्यूनतम (n - 1) और i + B के लिए, j को 1 से बढ़ाएँ -

      • अगर लागत [जे] + ए [i] <लागत [i], तो -

        • लागत[i] :=लागत[j] + A[i]

        • अगला[i] :=j

        • समापन बिंदु:=मैं

  • अगर एंडपॉइंट 0 के बराबर नहीं है, तो -

    • खाली सरणी लौटाएं

  • एंडपॉइंट के लिए -1 के बराबर नहीं है, एंडपॉइंट अपडेट करें =अगला [एंडपॉइंट], करें -

    • रिट के अंत में एंडपॉइंट + 1 डालें

  • वापसी रिट

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> cheapestJump(vector<int>& A, int B) {
      int n = A.size();
      vector <int> ret;
      vector <int> cost(n, 1e9);
      vector <int> next(n, -1);
      if(!n || A[n - 1] == -1) return {};
      int endPoint = n - 1;
      cost[n - 1] = A[n - 1];
      for(int i = n - 2; i >= 0; i--){
         if(A[i] == -1) continue;
         for(int j = i + 1 ; j <= min(n - 1, i + B); j++){
            if(cost[j] + A[i] < cost[i]){
               cost[i] = cost[j] + A[i];
               next[i] = j;
               endPoint = i;
            }
         }
      }
      if(endPoint != 0) return {};
      for(;endPoint != - 1; endPoint = next[endPoint]){
         ret.push_back(endPoint + 1);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,4,-1,2};
   print_vector(ob.cheapestJump(v, 2));
}

इनपुट

{1,2,4,-1,2}, 2

आउटपुट

[1, 3, 5, ]

  1. सी ++ कतार का उपयोग करके बीएसटी में पथ को उलट दें

    एक बाइनरी सर्च ट्री को देखते हुए, और उदाहरण के लिए, हमें किसी विशेष कुंजी से इसके पथ को उलटने की आवश्यकता होती है। समाधान खोजने के लिए दृष्टिकोण इस दृष्टिकोण में, हम एक कतार बनाएंगे और सभी नोड्स को तब तक धकेलेंगे जब तक हमें रूट नहीं मिल जाता। उदाहरण   #include <bits/stdc++.h> using n

  1. सी ++ पथ लंबाई जिसमें अधिकतम संख्या में मोड़ हैं

    एक समस्या को हल करने के लिए जिसमें हमें एक बाइनरी ट्री दिया जाता है। अब हमें उस पथ को खोजने की आवश्यकता है जिसमें अधिकतम संख्या में मोड़ हों। यानी, एक मोड़ तब माना जाता है जब पथ की दिशा बाएं से दाएं या इसके विपरीत बदलती है, उदाहरण के लिए इनपुट - आउटपुट - 6 अब इस दृष्टिकोण में, हम पेड़ से गुजरें

  1. सी++ में पथ योग III

    मान लीजिए कि हमने एक बाइनरी ट्री दिया है जिसमें प्रत्येक नोड में एक पूर्णांक कुंजी होती है। हमें उन पथों को खोजना है जो किसी दिए गए मान के योग हैं। रास्ता जड़ से पत्ती तक शुरू होना चाहिए। हमें वह रास्ता खोजना होगा जहां योग समान हो। अगर पेड़ [5,4,8,11,null,13,4,7,2,null,null,5,1] जैसा है, और योग 22