执行括号率计算的算法

时间:2017-10-24 18:40:33

标签: php algorithm multidimensional-array data-structures

让我们考虑一个括号内的关税,每个服务有三个(或更多)括号[或类别?我不确定正确的英语短语]。

例如,一辆停车场,不同车辆的费率,以及长度不超过4米的车的费用:

  • 前2天免费(或一次性10美元),然后
  • 接下来3天:每天5美元
  • 接下来4天:每天8美元
  • 接下来的2天:每天10美元
  • 天后:每天15美元

因此,如果我待8天,我将支付2 * 0 + 3 * 5 + 3 * 8 = 36美元。

我最初的逻辑是:

  1. 删除免费日
  2. 每个括号
  3. :检查是否还有天数,如果它们超过当前的括号范围,请将最大金额相加并继续,否则只计算剩余金额。
  4. 我的问题是:这个逻辑可以改进吗? (有更聪明的算法)

    什么数据结构能够以执行算法时可以走的方式保存资费信息?我看到数据表示为数据库中的表格(car,free days,bracket_span_1,amount_span_1,bracket_span_2,amount_span_2 ......)[但它不够通用],过去我尝试过字典{car:{free:2,[span_1:[days:2,amount:5],...}但我不太喜欢这个解决方案,因此问题就出现了。

    正如问题的标记所暗示的那样,我使用PHP来实现。

2 个答案:

答案 0 :(得分:1)

你可以像在子弹列表中描述的那样对括号进行编码,成对的是[下一个“天的数量,这些天的成本]。然后,您最多需要多次迭代,等于不同括号的数量。因此,即使汽车停放200天,循环也只会重复5次:

$brackets = [[2, 0], [3, 5] , [4, 8], [2, 10], [PHP_INT_MAX, 15]];

$days = 8;
$total = 0;
foreach ($brackets as list($nextDays, $dayFee)) {
    $total += min($nextDays, $days) * $dayFee;
    $days -= $nextDays;
    if ($days <= 0) break;
}
echo "Total is \$$total\n";

答案 1 :(得分:0)

只需将支架天数和费率放在一个数组中作为键/值对,然后循环停放汽车的天数。

$brackets=array(0=>0,2=>5,5=>8,9=>10,11=>15); // At 0 days rate is 0, from day 2 rate is $5 per day etc 
$days = 8;
$total = 0;
for ($i = 0; $i < $days; ++$i)  {      // Loop over each day
    if (isset($brackets[$i])) {
        $rate = $brackets[$i];         // Set new rate if applicable
    }
    $total = $total + $rate;           // Add daily rate to total
}
echo 'Total is $'.$total;