C++: كيفية حل هذه المشكلة؟ حصلت عليه تقريبا، فقط عالقة قليلا


كنت أقوم بحل مشكلات C++ حتى التقيت بهذه المشكلة، والتي لم أتمكن من تكييفها بعد فترة طويلة (لم أتمكن حتى من اجتياز العينة). الرجاء المساعدة!

لدى المزارع جون مهمة مهمة، وهي معرفة نوع التبن الذي سيشتريه لأبقاره.
أبقار المزارع جون (2 ≥N ≥10 ^ 5) مرقمة من 1 إلى N، وكل بقرة تحب نوعًا واحدًا بالضبط من التبن h(i): (1≥h(i)≥N. فهو يريد أن تحب جميع أبقاره نفس النوع من القش.
ولتحقيق ذلك، يستطيع المزارع جون استضافة مجموعات التركيز. تتكون مجموعة التركيز من جمع جميع الأبقار في نطاق متجاور مرقّم بـ ito j، ضمنًا، معًا للاجتماع. إذا كان هناك نوع من التبن يحبه أكثر من نصف الأبقار في المجموعة، فبعد انتهاء مجموعة التركيز من الاجتماع، ينتهي الأمر بجميع الأبقار إلى الإعجاب بهذا النوع من التبن. إذا لم يكن هناك مثل هذا النوع من التبن، فلن تغير الأبقار نوع التبن الذي تفضله. على سبيل المثال، في مجموعة التركيز التي تتكون من مجموعة مكونة من 16 بقرة، ستحتاج 9 منها أو أكثر إلى الحصول على نفس تفضيل التبن حتى تتمكن الأبقار المتبقية من تبديل تفضيلها للمطابقة.
يريد المزارع جون أن يعرف أنواع التبن التي يمكن أن تنال إعجاب جميع الأبقار في وقت واحد. يمكنه استضافة مجموعة تركيز واحدة فقط في كل مرة، لكن يمكنه تشغيل أكبر عدد ممكن من مجموعات التركيز حسب الضرورة لجعل جميع الأبقار تحب نفس النوع من القش.

نمط الإدخال:
الأول سيتكون من عدد صحيح T، للدلالة على عدد حالات الاختبار المستقلة (1≥T≥10)

يتكون السطر الأول من كل حالة اختبار من N.
يتكون السطر الثاني من أعداد صحيحة N، وهي الأنواع المفضلة من hay(i) للأبقار بالترتيب.
من المؤكد أن مجموع N في جميع حالات الاختبار لا يتجاوز 2⋅10^5.

تنسيق الإخراج:
خطوط الإخراج T، سطر واحد لكل حالة اختبار.
إذا كان من الممكن جعل جميع الأبقار تحب نفس النوع من التبن في وقت واحد، فقم بإخراج جميع أنواع التبن الممكنة بترتيب متزايد. خلاف ذلك، الإخراج -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. يمكن لـ FJ القيام بذلك عن طريق تشغيل مجموعة تركيز واحدة مع جميع الأبقار.
في حالة الاختبار الثانية، يمكننا أن نبين أنه لن تغير أي أبقار نوع القش الذي تفضله.
في حالة الاختبار الثالثة، من الممكن جعل جميع الأبقار مثل النوع 1 عن طريق تشغيل ثلاث مجموعات تركيز – أولاً عن طريق وجود الأبقار من 1 إلى 4 في مجموعة التركيز، ثم عن طريق وجود الأبقار من 1 إلى 5 في مجموعة التركيز، ثم عن طريق وجود الأبقار من 1 إلى 6 في مجموعة التركيز. وبمنطق مماثل، باستخدام الأبقار من 3 إلى 6، والأبقار من 2 إلى 6، ثم الأبقار من 1 إلى 6، يمكننا أن نجعل جميع الأبقار مثل النوع 2.
في حالة الاختبار الرابعة، من الممكن جعل جميع الأبقار مثل النوع 3 عن طريق تشغيل مجموعة تركيز واحدة مع جميع الأبقار.
في حالة الاختبار الخامسة، يمكننا أن نبين أنه لن تغير أي أبقار نوع القش الذي تفضله.

التسجيل:

* الإدخال 2: ن = 2.
* المدخلات 3-4: N ≥50.
* المدخلات 5-6: h (i) ≥h (i + 1) لجميع 1 ≥i ≥N−1.
* المدخلات 7-15: لا توجد قيود إضافية.

ما حاولت:

لقد قمت بإعداد الكود التالي (والذي يؤدي أيضًا إلى خطأ في إخراج نموذج الإدخال/الإخراج في السطر الأخير):

سي ++
#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をコピーしました