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

C++ में स्टूडेंट अटेंडेंस रिकॉर्ड II समस्या


मान लीजिए हमारे पास एक पॉजिटिव इंटीजर n है, हमें लंबाई n के सभी संभावित अटेंडेंस रिकॉर्ड्स की संख्या ढूंढनी है जो रिवॉर्डेबल हों। चूंकि उत्तर बहुत बड़ा हो सकता है, हम इसे मॉड 10⁹ + 7 का उपयोग करके लौटाएंगे।

स्टूडेंट अटेंडेंस रिकॉर्ड में स्ट्रिंग में केवल ये तीन वर्ण हो सकते हैं:

  • 'A' का अर्थ है अनुपस्थित (Absent)।
  • 'L' का अर्थ है देर से आना (Late)।
  • 'P' का अर्थ है उपस्थित (Present)।

एक अटेंडेंस को रिवॉर्डेबल माना जाता है यदि इसमें एक से अधिक 'A' नहीं हैं या लगातार दो से अधिक 'L' नहीं हैं।

यदि इनपुट 2 है, तो आउटपुट 8 होगा, क्योंकि हम 8 संभावित तरीके उत्पन्न कर सकते हैं जो रिवॉर्डेबल हैं: [PP, AP, PA, LP, PL, AL, LA, LL], केवल AA नहीं होगा।

समाधान दृष्टिकोण (डायनामिक प्रोग्रामिंग)

  1. add() फंक्शन परिभाषित करें जो a, b लेता है और ((a % m) + (b % m)) % m लौटाता है।
  2. मुख्य मेथड से:
    • आकार n+1 के ऐरे p, a, l, ap, al परिभाषित करें।
    • यदि n == 1, तो 3 लौटाएं।
    • आधार मामले इनिशियलाइज़ करें:
      • p[0]=1, p[1]=1, p[2]=3
      • a[0]=1, a[1]=1, a[2]=2
      • l[0]=1, l[1]=1, l[2]=3
      • ap[0]=1, ap[1]=1, ap[2]=2
      • al[0]=1, al[1]=1, al[2]=2
    • i = 3 से n तक लूप करें:
      • p[i] = add(add(p[i-1], a[i-1]), l[i-1])
      • l[i] = add(add(p[i-1], p[i-2]), add(a[i-1], a[i-2]))
      • a[i] = add(al[i-1], ap[i-1])
      • al[i] = add(ap[i-1], ap[i-2])
      • ap[i] = add(ap[i-1], al[i-1])
    • add(add(p[n], l[n]), a[n]) लौटाएं।

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

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

typedef long long int lli;
const lli MOD = 1e9 + 7;

class Solution {
public:
    lli add(lli a, lli b) {
        return ((a % MOD) + (b % MOD)) % MOD;
    }
    
    int checkRecord(int n) {
        vector<int> p(n+1), a(n+1), l(n+1), ap(n+1), al(n+1);
        if (n == 1) return 3;
        
        p[0] = 1; p[1] = 1; p[2] = 3;
        a[0] = 1; a[1] = 1; a[2] = 2;
        l[0] = 1; l[1] = 1; l[2] = 3;
        ap[0] = 1; ap[1] = 1; ap[2] = 2;
        al[0] = 1; al[1] = 1; al[2] = 2;
        
        for (int i = 3; i <= n; i++) {
            p[i] = add(add(p[i-1], a[i-1]), l[i-1]);
            l[i] = add(add(p[i-1], p[i-2]), add(a[i-1], a[i-2]));
            a[i] = add(al[i-1], ap[i-1]);
            al[i] = add(ap[i-1], ap[i-2]);
            ap[i] = add(ap[i-1], al[i-1]);
        }
        return add(add(p[n], l[n]), a[n]);
    }
};

int main() {
    Solution ob;
    cout << ob.checkRecord(3);
    return 0;
}

इनपुट

3

आउटपुट

19
  1. - C++ में संरचना में छात्र की जानकारी संग्रहीत करने का प्रोग्राम

    एक संरचना विभिन्न डेटा प्रकारों के आइटम्स का संग्रह है। यह विभिन्न डेटा प्रकार के रिकॉर्ड्स के साथ जटिल डेटा संरचनाएं बनाने में बहुत उपयोगी है। एक संरचना को struct कीवर्ड से परिभाषित किया जाता है। संरचना का एक उदाहरण निम्नलिखित है। struct employee {    int empID;    char name[50]

  1. - C++ में आइडेंटिफायर

    C++ आइडेंटिफायर एक नाम है जिसका उपयोग वेरिएबल, फ़ंक्शन, क्लास, मॉड्यूल, या किसी अन्य उपयोगकर्ता-परिभाषित आइटम की पहचान के लिए किया जाता है। एक आइडेंटिफायर A से Z या a से z तक के अक्षर या अंडरस्कोर (_) से शुरू होता है जिसके बाद शून्य या अधिक अक्षर, अंडरस्कोर, और अंक (0 से 9) आ सकते हैं। C++ आइडेंटिफ

  1. - लिनक्स पर C++ के लिए सर्वश्रेष्ठ IDE कौन सा है?

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। लिनक्स पर C++ के लिए कोई एक सर्वश्रेष्ठ IDE नहीं है; आपको अपने टूल को