أنا حل هذه المشكلة C++


يقوم المزارع جون بزراعة نباتات الهليون N(1≥N≥2⋅10^5) في مزرعته! لكن بعض نباتاته لديها اختلافات وراثية، لذلك تنمو بعض النباتات بشكل أسرع من غيرها. الارتفاع الأولي للنبات هو بوصة واحدة، وبعد كل يوم، ينمو النبات بمقدار بوصة واحدة.
يحب FJ بعض نباتاته أكثر من غيرها، ويريد أن تكون بعض النباتات المحددة أطول من غيرها. إنه يعطيك مجموعة من القيم المميزة t1……tn التي تحتوي على جميع الأعداد الصحيحة من 0 إلى N−1 ويريد أن يحتوي النبات i على نباتات أخرى أطول منه. ابحث عن الحد الأدنى لعدد الأيام حتى يتم تلبية طلب FJ، أو حدد أنه مستحيل.
مدخل:
الأول سيتكون من عدد صحيح T، للدلالة على عدد حالات الاختبار المستقلة (1≥T≥10)
يتكون السطر الأول من كل حالة اختبار من عدد صحيح N.
يتكون السطر الثاني من أعداد صحيحة N hi (1≤hi≥10^9) تشير إلى الارتفاع الأولي للنبات i بالبوصة.
يتكون السطر الثالث من الأعداد الصحيحة N ai (1≤ai≥10^9) التي تشير إلى عدد البوصات التي ينموها النبات كل يوم.
يتكون السطر الرابع من أعداد صحيحة مميزة N ti تشير إلى المصفوفة التي يوفرها لك FJ.
من المؤكد أن مجموع N في جميع حالات الاختبار لا يتجاوز 2⋅10^5

انتاج:
إخراج خطوط T، والإجابة على كل حالة اختبار على سطر مختلف. إذا لم يكن ذلك ممكنا، الإخراج -1.
لاحظ أن الحجم الكبير للأعداد الصحيحة المتضمنة في هذه المشكلة قد يتطلب استخدام أنواع بيانات صحيحة 64 بت (على سبيل المثال، “طويلة طويلة” في C/C++).
نموذج الإدخال 1:
6
1
10
1
0
2
7 3
8 10
1 0
2
3 6
10 8
0 1
2
7 3
8 9
1 0
2
7 7
8 8
0 1
2
7 3
8 8
1 0

نموذج الإخراج 1:
0
3
2
5
-1
-1

في إدخال العينة الأولى، هناك 6 حالات اختبار.
في حالة الاختبار الأولى، يوجد مصنع واحد فقط، وبالتالي يتم استيفاء الشرط في اليوم 0.
في حالة الاختبار الثانية، نحتاج إلى أن يكون النبات الأول أقصر من النبات الثاني. بعد اليوم الأول، يكون الارتفاعان 15 و13. وبعد اليوم الثاني، يكون الارتفاعان 23. وبعد اليوم 3، يكون الارتفاعان 31 و33، وهذا هو اليوم الأول الذي يتم فيه استيفاء الشرط.
حالات الاختبار الثالثة والرابعة مماثلة للثانية.
في حالة الاختبار الخامسة، يبدأ كلا النباتين بارتفاع أولي قدره 7 ومعدل نمو قدره 8. لذلك سيكون لهما دائمًا ارتفاعات متطابقة، وبالتالي لا يتم استيفاء الشرط أبدًا.
وفي حالة الاختبار السادس، لم يتم استيفاء الشرط في البداية وكانت معدلات النمو واحدة. وبالتالي فإن الشرط لا يمكن أن يكون راضيا أبدا.
نموذج الإدخال 2:
2
5
7 4 1 10 12
3 4 5 2 1
2 1 0 3 4
5
4 10 12 7 1
3 1 1 4 5
2 4 3 1 0

نموذج الإخراج 2:
4
7

في إدخال العينة الثانية، هناك حالتان للاختبار.
في حالة الاختبار الأولى، الارتفاعات النهائية بعد اليوم الرابع هي 19، 20، 21، 18، 16.
في حالة الاختبار الثانية، الارتفاعات النهائية بعد اليوم السابع هي 25، 17، 19، 35، 36.

ما حاولت:

جربت هذين الرمزين المختلفين (قليلًا جدًا):
1.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool isPossible(const vector<int>& h, const vector<int>& a, const vector<int>& t, long long days) {
    int n = h.size();
    vector<pair<long long, int>> heights;

    for (int i = 0; i < n; ++i) {
        heights.push_back({h[i] + days * a[i], t[i]});
    }

    sort(heights.begin(), heights.end(), greater<pair<long long, int>>());

    for (int i = 0; i < n; ++i) {
        if (heights[i].second > i) {
            return false;
        }
    }

    return true;
}

long long minDays(const vector<int>& h, const vector<int>& a, const vector<int>& t) {
    int n = h.size();

    if (n <= 1) {
        return 0; // No need for days if there are 0 or 1 plants.
    }

    long long low = 0, high = 1e18, result = -1;  // Adjusted upper limit

    // Handle smaller inputs efficiently
    if (n <= 2) {
        for (long long i = 0; i <= 1e3; ++i) {
            if (isPossible(h, a, t, i)) {
                result = i;
                break;
            }
        }
    } else if (n <= 50) {
        for (long long i = 0; i <= 1e3; ++i) {
            if (isPossible(h, a, t, i)) {
                result = i;
                break;
            }
        }
    } else {
        while (low <= high) {
            long long mid = low + (high - low) / 2;

            if (isPossible(h, a, t, mid)) {
                result = mid;
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
    }

    return result;
}

int main() {
    int T;
    cin >> T;

    while (T--) {
        int N;
        cin >> N;

        vector<int> h(N), a(N), t(N);

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

        for (int i = 0; i < N; ++i) {
            cin >> a[i];
        }

        for (int i = 0; i < N; ++i) {
            cin >> t[i];
        }

        long long result = minDays(h, a, t);
        cout << result << endl;
    }

    return 0;
}

2.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool isPossible(const vector<int>& h, const vector<int>& a, const vector<int>& t, long long days) {
    int n = h.size();
    vector<pair<long long, int>> heights;

    for (int i = 0; i < n; ++i) {
        heights.push_back({h[i] + days * a[i], t[i]});
    }

    sort(heights.begin(), heights.end(), greater<pair<long long, int>>());

    for (int i = 0; i < n; ++i) {
        if (heights[i].second > i) {
            return false;
        }
    }

    return true;
}

long long minDays(const vector<int>& h, const vector<int>& a, const vector<int>& t) {
    int n = h.size();

    long long low = 0, high = 2e9, result = -1;  // Adjusted upper limit for large inputs

    // Handle smaller inputs efficiently
    if (n <= 2) {
        for (long long i = 0; i <= 2e3; ++i) {  // Adjusted range for small inputs
            if (isPossible(h, a, t, i)) {
                result = i;
                break;
            }
        }
    } else if (n <= 50) {
        for (long long i = 0; i <= 2e3; ++i) {  // Adjusted range for medium inputs
            if (isPossible(h, a, t, i)) {
                result = i;
                break;
            }
        }
    } else {
        while (low <= high) {
            long long mid = low + (high - low) / 2;

            if (isPossible(h, a, t, mid)) {
                result = mid;
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
    }

    return result;
}

int main() {
    int T;
    cin >> T;

    while (T--) {
        int N;
        cin >> N;

        vector<int> h(N), a(N), t(N);

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

        for (int i = 0; i < N; ++i) {
            cin >> a[i];
        }

        for (int i = 0; i < N; ++i) {
            cin >> t[i];
        }

        long long result = minDays(h, a, t);
        cout << result << endl;
    }

    return 0;
}

الحل 1

هذه هي نفس المشكلة كيف يمكنني حل هذه المشكلة لجميع القيود[^]. تحتاج فقط إلى التكيف مع نمو الهليون، بدلاً من تقلص قصب الحلوى.

コメント

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