C++: इस समस्या को कैसे हल करें? लगभग मिल गया, बस थोड़ा अटक गया


मैं C++ समस्याओं से जूझ रहा था जब तक कि मुझे यह समस्या नहीं मिल गई, जिसे मैं लंबे समय के बाद भी AC नहीं कर सका (नमूना भी पास नहीं कर सका)। कृपया मदद करे!

किसान जॉन के पास एक महत्वपूर्ण कार्य है – यह पता लगाना कि अपनी गायों के लिए किस प्रकार की घास खरीदनी है।
किसान जॉन की गायें (2≤N≤10^5) क्रमांक 1 से लेकर नंद तक हैं, प्रत्येक गाय बिल्कुल एक प्रकार की घास पसंद करती है h(i): (1≤h(i)≤N। वह चाहता है कि उसकी सभी गायें एक ही प्रकार की घास पसंद करें घास का.
ऐसा करने के लिए, किसान जॉन फोकस समूहों की मेजबानी कर सकता है। एक फोकस समूह में सभी गायों को एक बैठक के लिए एक साथ एकत्रित करना शामिल है, जिसमें ito j तक क्रमांकित संख्या शामिल है। यदि किसी प्रकार की घास है जो समूह की आधी से अधिक गायों को पसंद है, तो फोकस समूह की बैठक समाप्त होने के बाद, सभी गायें उस प्रकार की घास को पसंद करने लगती हैं। यदि इस प्रकार की कोई घास मौजूद नहीं है, तो कोई भी गाय अपनी पसंद की घास का प्रकार नहीं बदलती। उदाहरण के लिए, 16 गायों वाले फोकस समूह में, उनमें से 9 या अधिक को समान घास प्राथमिकता की आवश्यकता होगी ताकि शेष गायें अपनी प्राथमिकता को मिलान के अनुसार बदल सकें।
किसान जॉन जानना चाहता है कि किस प्रकार की घास सभी गायों को एक साथ पसंद आ सकती है। वह एक समय में केवल एक फोकस समूह की मेजबानी कर सकता है, लेकिन वह सभी गायों को एक ही प्रकार की घास पसंद करने के लिए आवश्यकतानुसार कई फोकस समूह चला सकता है।

इनपुट प्रारूप:
पहले में एक पूर्णांक T शामिल होगा, जो स्वतंत्र परीक्षण मामलों की संख्या को दर्शाता है (1≤T≤10)

प्रत्येक परीक्षण मामले की पहली पंक्ति में N होता है।
दूसरी पंक्ति में एन पूर्णांक शामिल हैं, क्रम में गायों के लिए पसंदीदा प्रकार की घास एच(आई)।
यह गारंटी है कि सभी परीक्षण मामलों में N का योग 2⋅10^5 से अधिक नहीं है।

आउटपुट स्वरूप:
आउटपुट टी लाइन, प्रति टेस्ट केस एक लाइन।
यदि सभी गायों को एक ही प्रकार की घास एक साथ खिलाना संभव है, तो सभी संभावित प्रकार की घास को बढ़ते क्रम में उत्पादित करें। अन्यथा, आउटपुट -1. एक ही लाइन पर संख्याओं की सूची प्रिंट करते समय, आसन्न संख्याओं को एक रिक्त स्थान के साथ अलग करें, और सुनिश्चित करें कि पंक्ति किसी भी बाहरी रिक्त स्थान के साथ समाप्त न हो।

नमूना इनपुट:
5
5
1 2 2 2 3
6
1 2 3 1 2 3
6
1 1 1 2 2 2
3
3 2 3
2
2 1
नमूना आउटपुट:
2
-1
1 2
3
-1
नमूना इनपुट में, 5 परीक्षण मामले हैं।
पहले परीक्षण मामले में, सभी गायों को टाइप 2 की तरह बनाना संभव है। एफजे सभी गायों के साथ एक एकल फोकस समूह चलाकर ऐसा कर सकता है।
दूसरे परीक्षण मामले में, हम दिखा सकते हैं कि कोई भी गाय यह नहीं बदलेगी कि उन्हें किस प्रकार की घास पसंद है।
तीसरे परीक्षण मामले में, तीन फोकस समूह चलाकर सभी गायों को टाइप 1 की तरह बनाना संभव है – पहले फोकस समूह में 1 से 4 गायों को रखकर, फिर फोकस समूह में 1 से 5 तक गायों को रखकर, फिर गायों को रखकर फोकस समूह में 1 से 6 तक। समान तर्क से, गाय 3 से 6, गाय 2 से 6, फिर गाय 1 से 6 का उपयोग करके, हम सभी गायों को टाइप 2 की तरह बना सकते हैं।
चौथे परीक्षण मामले में, सभी गायों के साथ एकल फोकस समूह चलाकर सभी गायों को टाइप 3 की तरह बनाना संभव है।
पांचवें परीक्षण मामले में, हम दिखा सकते हैं कि कोई भी गाय यह नहीं बदलेगी कि उन्हें किस प्रकार की घास पसंद है।

स्कोरिंग:

* इनपुट 2: एन=2.
* इनपुट 3-4: एन≤50।
* इनपुट 5-6: h(i)≤h(i+1) सभी 1≤i≤N−1 के लिए।
* इनपुट 7-15: कोई अतिरिक्त बाधा नहीं।

मैंने क्या प्रयास किया है:

मैंने निम्नलिखित कोड पर काम किया है (जिसमें नमूना i/o के आउटपुट की अंतिम पंक्ति भी गलत हो जाती है):

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

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int T;
    cin >> T;
    while(T--) {
        int N;
        cin >> N;
        vector<int> h(N);
        for(int i=0; i<N; i++) {
            cin >> h[i];
        }

        map<int, int> count;
        for(int i=0; i<N; i++) {
            count[h[i]]++;
        }

        vector<int> possible;
        for(auto &p : count) {
            if(p.second > N/2) {
                possible.push_back(p.first);
            }
        }

        if(possible.empty()) {
            // Check for types of hay liked by exactly half the cows
            for(auto &p : count) {
                if(p.second == N/2) {
                    possible.push_back(p.first);
                }
            }
        }

        if(possible.empty()) {
            cout << -1 << "\n";
        } else {
            sort(possible.begin(), possible.end());
            for(int i=0; i<possible.size(); i++) {
                cout << possible[i] << (i == possible.size()-1 ? "\n" : " ");
            }
        }
    }

    return 0;
}

यदि किसी के पास कोड में कोई समाधान या परिवर्तन है जो प्रश्न को हल कर सकता है, तो कृपया मुझे बताएं! आपका बहुत धन्यवाद!

समाधान 1

संकलन का मतलब यह नहीं है कि आपका कोड सही है! :हँसना:
विकास प्रक्रिया को एक ईमेल लिखने के रूप में सोचें: सफलतापूर्वक संकलित करने का मतलब है कि आपने ईमेल को सही भाषा में लिखा है – उदाहरण के लिए जर्मन के बजाय अंग्रेजी – न कि ईमेल में वह संदेश है जो आप भेजना चाहते थे।

तो अब आप विकास के दूसरे चरण में प्रवेश करते हैं (वास्तव में यह चौथा या पांचवां है, लेकिन आप बाद में पहले चरण में आएंगे): परीक्षण और डिबगिंग।

यह देखकर प्रारंभ करें कि यह क्या करता है, और यह जो आप चाहते थे उससे किस प्रकार भिन्न है। यह महत्वपूर्ण है, क्योंकि यह आपको जानकारी देता है कि वह ऐसा क्यों कर रहा है। उदाहरण के लिए, यदि किसी प्रोग्राम का उद्देश्य उपयोगकर्ता को एक संख्या दर्ज करने देना है और वह उसे दोगुना कर उत्तर प्रिंट करता है, तो यदि इनपुट/आउटपुट इस प्रकार था:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

फिर यह बिल्कुल स्पष्ट है कि समस्या उस बिट के साथ है जो इसे दोगुना करता है – यह स्वयं को स्वयं में नहीं जोड़ रहा है, या इसे 2 से गुणा नहीं कर रहा है, यह इसे स्वयं से गुणा कर रहा है और इनपुट का वर्ग वापस कर रहा है।
तो इसके साथ, आप कोड को देख सकते हैं और यह स्पष्ट है कि यह यहीं कहीं है:

सी++
int Double(int value)
   {
   return value * value;
   }

एक बार जब आपको अंदाजा हो जाए कि क्या गलत हो रहा है, तो इसका कारण जानने के लिए डिबगर का उपयोग करना शुरू करें। विधि की पहली पंक्ति पर एक ब्रेकप्वाइंट लगाएं, और अपना ऐप चलाएं। जब यह ब्रेकप्वाइंट पर पहुंच जाएगा, तो डिबगर रुक जाएगा, और नियंत्रण आपको सौंप देगा। अब आप अपना कोड लाइन-दर-लाइन चला सकते हैं (जिसे “सिंगल स्टेपिंग” कहा जाता है) और आवश्यकतानुसार वैरिएबल सामग्री को देख सकते हैं (या बदल भी सकते हैं) (हेक, आप कोड को बदल भी सकते हैं और यदि आवश्यक हो तो पुनः प्रयास कर सकते हैं)।
इस बारे में सोचें कि कोड को निष्पादित करने से पहले प्रत्येक पंक्ति को क्या करना चाहिए, और इसकी तुलना तब करें जब आप प्रत्येक पंक्ति को बारी-बारी से निष्पादित करने के लिए “स्टेप ओवर” बटन का उपयोग करते हैं। क्या इसने वही किया जो आप अपेक्षा करते थे? यदि हां, तो अगली पंक्ति पर आगे बढ़ें।
यदि नहीं, तो क्यों नहीं? यह किस प्रकार भिन्न है?
उम्मीद है, इससे आपको यह पता लगाने में मदद मिलेगी कि उस कोड के किस हिस्से में समस्या है और समस्या क्या है।
यह एक कौशल है, और यह विकसित करने लायक है क्योंकि यह आपको वास्तविक दुनिया के साथ-साथ विकास में भी मदद करता है। और सभी कौशलों की तरह, इसमें केवल उपयोग से ही सुधार होता है!

コメント

タイトルとURLをコピーしました