[ad_1]
农夫约翰正在他的农场种植 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
我也需要帮助,如果你解决了请告诉我
[ad_2]
コメント