让我们考虑一个括号内的关税,每个服务有三个(或更多)括号[或类别?我不确定正确的英语短语]。
例如,一辆停车场,不同车辆的费率,以及长度不超过4米的车的费用:
因此,如果我待8天,我将支付2 * 0 + 3 * 5 + 3 * 8 = 36美元。
我最初的逻辑是:
我的问题是:这个逻辑可以改进吗? (有更聪明的算法)
什么数据结构能够以执行算法时可以走的方式保存资费信息?我看到数据表示为数据库中的表格(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来实现。
答案 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;