C++问题中潜在的逻辑问题


农夫约翰正在他的农场种植 N(1≤N≤2⋅10^5) 株芦笋! 然而,他的一些植物有遗传差异,所以有些植物会比其他植物生长得更快。 第 i 株植物的初始高度为 hi 英寸,每天之后,第 i 株植物会生长 ai 英寸。
FJ 比其他植物更喜欢他的一些植物,并且他希望某些特定植物比其他植物更高。 他给你一个由不同值 t1…tn 组成的数组,其中包含从 0 到 N−1 的所有整数,并且他希望第 i 个植物恰好有 ti 个比它高的植物。 求满足FJ 的要求的最少天数,或者确定不可能。
输入:
第一个由整数 T 组成,表示独立测试用例的数量 (1≤T≤10)
每个测试用例的第一行由一个整数N组成。
第二行由 N 个整数 hi (1≤hi≤10^9) 组成,表示第 i 个植物的初始高度(以英寸为单位)。
第三行由N个整数ai(1≤ai≤10^9)组成,表示第i棵植物每天生长的英寸数。
第四行由 N 个不同的整数 ti 组成,表示 FJ 给您的数组。
保证所有测试用例的 N 之和不超过 2⋅10^5

输出:
输出T行,每个测试用例的答案在不同的行上。 如果不可能,则输出-1。
请注意,此问题涉及的大尺寸整数可能需要使用 64 位整数数据类型(例如,C/C++ 中的“long long”)。
示例输入 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 天满足条件。
在第二个测试用例中,我们需要第一个植物比第二个植物短。 第 1 天后,身高为 15 和 13。第 2 天后,身高均为 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

在第二个示例输入中,有 2 个测试用例。
在第一个测试用例中,第 4 天后的最终高度为 19、20、21、18、16。
在第二个测试用例中,第 7 天后的最终高度为 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

这与以下问题相同 如何解决所有约束条件下的这个问题[^]。 你只需要适应芦笋的生长,而不是拐杖糖的缩小。

解决方案2

我也需要帮助,如果你解决了请告诉我

コメント

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