我们给了两个数组 H [] 和 B [] ,它们的大小均为 n 。 H [i] 表示第(i)个人拥有的普通汽车数量。 我有'm'宝马汽车,可以用hundai代替。 B [i] 包含等于 1 BMW的hundai汽车数量(意味着每个人的当量可能有所不同)。 给出:
H[i]%B[i]=0;
问题是要通过用BMW代替 max(H [i])来最小化 max (请注意,我们只有m BMW)。 需要O(n)或O(nlogn)解决方案。
答案 0 :(得分:1)
使用 binary search 可以解决围绕minimizing .. the maximum of ..
的想法我已经在这里同样回答了一个问题:https://stackoverflow.com/a/52679263/10291310
对于您的情况,我们可以将算法修改为
start = 0, end = 10^18 // Or your max `M` limit
while start <= end:
bmw_used = 0 // Number of bmws used till now for this iteration
mid = (start + end) / 2
// Let's see if its possible to lower down all the hyndais such
// that number of each hundai <= mid
for i in range(0,N):
if H[i] > mid:
// Calculate the number of bmws required to bring H[i] <= mid
bmw_required = ceil(1.0 * (H[i] - mid) / B[i])
bmw_used += bmw_required
// After iterating over the Hyndais
if bmw_used > M:
// We're exceeding the number of bmws, hence increase the number of huyndai
start = mid + 1
else:
// We still have some more bmws left, so let's reduce more hyndais
end = mid - 1
return start
该解决方案的总运行时复杂度为 O(N * log(M))。干杯!
答案 1 :(得分:0)
伪代码
productsSchema.index({'$**': 'text'})
总复杂度为O(mn)。
如果可以忽略m,则为O(n)。
当H值相同时,该算法可能会有一些不必要的循环,但这不是一个大问题。