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

पायथन में श्रमिकों को सिक्के वितरित करने के तरीकों की संख्या की गणना करने का कार्यक्रम

मान लीजिए कि हमारे पास सकारात्मक संख्याओं की दो सूचियाँ हैं जिन्हें सिक्के और वेतन कहा जाता है। यहां सिक्के [i] सिक्का I और वेतन के मूल्य को इंगित करता है [j] कार्यकर्ता जे के लिए भुगतान करने के लिए आवश्यक वेतन की कम से कम राशि को इंगित करता है। अब मान लीजिए कि हमारे पास प्रति प्रकार एक सिक्का है और हमें प्रत्येक कार्यकर्ता को ठीक एक सिक्का देना होगा, हमें प्रत्येक कार्यकर्ता को सिक्के देने के तरीकों की संख्या की गणना करनी होगी। यहां दो तरीके अलग हैं यदि कोई कार्यकर्ता एक तरह से एक प्रकार का सिक्का प्राप्त करता है लेकिन दूसरे तरीके से एक अलग प्रकार का सिक्का प्राप्त करता है। यदि परिणाम बहुत बड़ा है तो वापसी परिणाम मॉड 10^9+7।

इसलिए, यदि इनपुट सिक्के =[1, 2, 3], वेतन =[1, 2] की तरह है, तो आउटपुट 4 होगा, जैसे कि हम पहले सिक्के (मान 1) का उपयोग नहीं करते हैं, तो दोनों सिक्के हैं दोनों श्रमिकों के लिए मान्य है, इसलिए श्रमिकों को भुगतान करने के दो तरीके हैं। अब अगर हम पहले सिक्के का उपयोग करते हैं, तो यह केवल पहले कार्यकर्ता के पास जा सकता है, और फिर हम शेष सिक्के में से किसी एक का उपयोग दूसरे कार्यकर्ता को भुगतान करने के लिए कर सकते हैं। तो इसके चार तरीके हैं।

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

  • सूची के सिक्कों को क्रमबद्ध करें, और सूची वेतन को क्रमबद्ध करें
  • num_coins :=सिक्कों का आकार
  • num_salaries :=वेतन का आकार
  • dp :=एक नया नक्शा
  • वेतन में प्रत्येक वेतन के लिए, करें
    • l :=0, r :=num_coins - 1
    • idx :=num_coins
    • जबकि l <=r, करते हैं
      • एम:=एल +(आर - एल) / 2
      • यदि सिक्के[m]>=वेतन, तो
        • आईडीएक्स:=मी
        • r :=m - 1
      • अन्यथा,
        • एल :=एम + 1
    • यदि idx, num_coins के समान है, तो
      • वापसी 0
    • dp[वेतन] :=idx
  • res :=1
  • मेरे लिए num_salaries - 1 से 0 की सीमा में, 1 से घटाएं
    • वेतन:=वेतन[i]
    • आईडीएक्स:=डीपी[वेतन]
    • res :=res *(num_coins - idx + 1) -(num_salaries - i)
  • रिटर्न रेस मोड 10^9+7

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

उदाहरण

class Solution:
   def solve(self, coins, salaries):
      coins.sort()
      salaries.sort()
      num_coins = len(coins)
      num_salaries = len(salaries)
      dp = {}
      for salary in salaries:
         l = 0
         r = num_coins - 1
         idx = num_coins
         while l <= r:
            m = l + (r - l) // 2
            if coins[m] >= salary:
               idx = m
               r = m - 1
            else:
               l = m + 1
         if idx == num_coins:
            return 0
         dp[salary] = idx
      res = 1
      for i in range(num_salaries - 1, -1, -1):
         salary = salaries[i]
         idx = dp[salary]
         res *= (num_coins - idx + 1) - (num_salaries - i)
      return res % (10**9+7)
ob = Solution()
coins = [1, 2, 3]
salaries = [1, 2]
print(ob.solve(coins, salaries))

इनपुट

[1, 2, 3],[1, 2]

आउटपुट

4

  1. पायथन में एस में अलग-अलग सबस्ट्रिंग की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास एक स्ट्रिंग s है, हमें s के अलग-अलग गैर-रिक्त सबस्ट्रिंग की संख्या ज्ञात करनी है। इसलिए, यदि इनपुट s =abaa जैसा है, तो आउटपुट 8 होगा, क्योंकि सबस्ट्रिंग [a, b, ab, ba, aa, aba, बा, आबा]। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - कोशिश करें:=एक नया नक्शा n :=आकार का

  1. पायथन में अधिकतम k लगातार गेम जीतने के तरीकों की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास दो संख्याएँ n और k हैं। यहाँ n हमारे द्वारा खेले जाने वाले खेलों की संख्या को दर्शाता है। हमें यह पता लगाना है कि हम कितने तरीकों से k या उससे कम गेम लगातार जीत सकते हैं। अगर उत्तर बहुत बड़ा है तो परिणाम को 10^9 + 7 से संशोधित करें। इसलिए, यदि इनपुट n =3 k =2 जैसा है, तो आउटप

  1. पायथन में n नोड्स के साथ BST की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास अलग-अलग नोड हैं। सभी अलग हैं। हमें यह पता लगाना है कि हम उन्हें कितने तरीकों से व्यवस्थित कर सकते हैं ताकि हम बाइनरी सर्च ट्री बना सकें। जैसा कि हम बाइनरी सर्च ट्री के बारे में जानते हैं, लेफ्ट सबट्री में हमेशा छोटे मान होते हैं और राइट सबट्री में बड़े मान होते हैं। इसे हल कर