如何计算阈值(基础数学)

时间:2017-06-30 13:29:19

标签: javascript algorithm math

我正在寻找一种算法来以最灵活的方式计算:

我正在进行成本计算,正在寻找一种优雅的解决方案来解决以下问题:

单位(U)可以是任意数字。

可以有无限数量的阈值(T),但它们都与定价(P)i.E。相关:

T:[10,200,1500,2712]

P:[5,4,3,1,10]

低于10的任何费用5欧元,

10-200之间的任何单位费用4€,

200-1500之间的任何单位花费3€,

1500-2712之间的任何单位花费1欧元,

2712以上的任何费用都是10欧元

所以1600的单位将花费:

50(单位从0到10)+ 760(单位从10到200)+ 3900(单位从200到1500)+ 100(剩余100单位在1500以上)= 4810€

计算这个的好方法是什么?

虽然记住任何值都是可变的,但所有阈值和相应的价格和单位可以随时变化。 (唯一固定的东西,价格总是与阈值相关)

€:我尝试使用嵌套的if / else语句做一些事情,但它完全混乱并且根本不灵活,因为阈值也可能超过4个值......

2 个答案:

答案 0 :(得分:1)

我要做的是稍微重述一下这个问题。我将定义一个数据结构,该数据结构具有给定价格点的单位数量的有序列表。

所以在你的阈值示例中,我将制作我的新阈值数组(带宽大小的BS):

BS:[10,190,1300,1212]

因此T[0]BS[k]相同。然后T[k]-T[k-1]将为menu.component.ts

有了这个,我们的定价数组我会使用以下算法。

  1. 将剩余单位(R)设为等于U。
  2. 从BS中读取下一个值。
  3. 是R> BS?如果是,请转到4.如果否,请转到6.
  4. 将BS * P添加到小计。从R。
  5. 删除BS
  6. 这是BS的最后一个值吗?如果是,请转到8.如果没有,请转到2.
  7. 将R * P添加到小计。
  8. 转到第9位。
  9. 将R * FinalT添加到小计。
  10. 完成。
  11. 这实际上是在您的示例中执行的操作。如果您的号码已经过去,或者您的总数落在一个范围内,那么您可以在价格区间内添加该区间的全部价值。

    我从T转换为BS只是因为它看起来有点整洁(对我而言)不必在循环本身中计算带宽。该算法应该非常简单地转换为代码(for循环和几个ifs应该做的伎俩)。

答案 1 :(得分:1)

var T = [10, 200, 1500, 2712];
var P = [5, 4, 3, 1, 10];
function calculate(n){
    var i = 0;
    var current = 0;
    var cost = 0;
    while(n > 0 && i < T.length){
        var min = Math.min(T[i] - current, n);
        current += min;
        cost += P[i] * min;
        n -= min;
        i += 1;
    }
    if(n > 0){
        cost += P[i] * n;
    }
    return cost;
}

在这里,我将跟踪使用变量当前计算成本的单位。最后,我正在检查是否有剩余的单位尚未计算成本,我将P中的最后一个元素与剩余单位相乘以得到总成本。