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



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

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

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

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

电话: [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 个值......

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 中的最后一个元素乘以剩余单位以获得总成本。

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

因此,在您的阈值示例中,我会将我的新阈值数组(BS 表示带宽大小(设为:

BS: [10, 190, 1300, 1212]

所以BS[0]T[0]一样.那么BS[k]T[k]-T[k-1]

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

  1. 将剩余单位 (R( 设置为等于 U。
  2. 从 BS 读取下一个值。
  3. R 是> BS 吗?如果是,请转到 4。如果没有,请转到 6。
  4. 将 BS*P 添加到小计中。从 R 中删除 BS。
  5. 这是BS的最后一个值吗?如果是,请转到 8。如果没有,请转到 2。
  6. 将 R*P 添加到小计。
  7. 转到 9。
  8. 将 R*FinalT 添加到小计。
  9. 完成。

这实际上是在执行您在示例中执行的操作。如果您的数字超过或您的总数落在添加该部分的范围内,您可以在价格范围内循环,添加该范围的全部值。

我从 T 转换为 BS 只是因为它看起来有点整洁(对我来说(,不必在循环本身中计算带大小。该算法应该非常简单,可以转换为代码(一个 for 循环和几个 ifs 应该可以解决问题(。

最新更新