根据给定标准的最大金额

Posted

技术标签:

【中文标题】根据给定标准的最大金额【英文标题】:maximum sum according to given criteria 【发布时间】:2016-05-27 19:45:13 【问题描述】:

我正在解决作为作业分配给我的一个问题。我很努力,但无法达到最佳解决方案。

有 N 个商店,所有商店都线性排列,索引为 1,2,3...N。购买任何 来自商店S(i) 的正数商品提供等于H(i) 的幸福感。 不幸的是,由于一些不可避免的情况,每个店主都有 引入了一个值L(i)。如果您在ith 商店获得 H(i) 幸福,则 并且仅当这是您购买东西的第一家商店或您购买时 这家商店至少有一件商品,您最后一次购物的商店是S(j) 这样L(j)≤L(i)j<i。找到最大的幸福总和 按照上面给出的规则获得!

我想应用最大子数组总和并将L(i) 作为标准。这是代码->>

long long ans=INT_MIN, temp=0, prev=-1;

for(int i=0;i<n;i++)
    l = L[i];
    if(l>=prev)
        temp+=H[i];
        if(temp<0)
            temp = 0;
            prev = -1;
        
        if(temp>ans)
            ans = temp;
            prev=L[i];
        
    
    else
        if(H[i]>ans)
            ans = H[i];
            prev = L[i];
            temp = H[i];
        
        else if(H[i] == ans && L[i]<prev)
            prev = L[i];
    

这不适用于许多测试用例!有更好的解决方案吗?

【问题讨论】:

你用“纸笔”解决方案了吗? 你尝试了几个测试用例并编写了解决方案......但意识到这是错误的! 我猜有些东西不见了。没有任何条件可以阻止我们从 1 到 N 的所有商店购物。 你知道L 可能包含的内容吗?还是那不可用? 我问是因为如果L 只有不同的、有限的值(比如只有1, 2, 3, or 4),那么您可以使用查找并将复杂性降低到O(N) 【参考方案1】:

令 F[i] 等于如果最后访问的商店是 i 可获得的最大幸福。

您可以通过计算所有有效前任(j

那么你能做的最好的就是F[i]中的最大值。

【讨论】:

这是一个 O(n^2) 算法...可以在线性时间内完成吗? 在这方面没有比 O(n^2) 做得更好的方法 但问题约束(N 应该可以在O(n log n) 中实现这个。我们需要在[0, L[i]] 中找到最大值,例如,我们可以用线段树在对数时间内完成。如果L 很小,这是可行的,如果不是,可能有办法将L 标准化为[0, n] @IVlad 我同意,我们可以在 O(nlogn) 时间内对 L[i] 值进行排序以使其正常化,因此您的方法应该始终可以正常工作。【参考方案2】:

L[i] 将确定您可以采用的可能路径,因此我认为您应该能够构建具有不同起点的多棵树 L[i] 每个节点都包含 H[i] 作为值。 然后你遍历这棵树,每片叶子的总和给你可能的幸福。

【讨论】:

建造树木听起来很复杂,并且至少需要 O(n^2) 来确定可能的孩子 经过进一步求解,树的构造确实比我想象的要复杂。而且我在构造方面的改进似乎使其收敛到 Peter de Rivaz 的回答。

以上是关于根据给定标准的最大金额的主要内容,如果未能解决你的问题,请参考以下文章

高性能凑票工具:从给定金额列表中计算满足目标金额的所有组合

高并发红包整体设计方案

如何在另一列中显示最大日期金额?

oracle分组后取出根据某列分组后的最大值

SQL查询用于查找用户每月的最大金额[重复]

笔试题--红包算法,给定一个红包总金额和分红包的人数,输出每个人随机抢到的红包数量。