通过用宝马取代最大的最大减法

时间:2018-10-09 14:26:43

标签: algorithm data-structures

我们给了两个数组 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)解决方案。

2 个答案:

答案 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值相同时,该算法可能会有一些不必要的循环,但这不是一个大问题。