Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 执行支架率计算的算法 让我们考虑一个括号内的关税,每个服务有三个(或更多)括号[或类?我不确定正确的英语短语]。_Php_Algorithm_Multidimensional Array_Data Structures - Fatal编程技术网

Php 执行支架率计算的算法 让我们考虑一个括号内的关税,每个服务有三个(或更多)括号[或类?我不确定正确的英语短语]。

Php 执行支架率计算的算法 让我们考虑一个括号内的关税,每个服务有三个(或更多)括号[或类?我不确定正确的英语短语]。,php,algorithm,multidimensional-array,data-structures,Php,Algorithm,Multidimensional Array,Data Structures,例如,停车场对不同车辆收费,如果车辆长度小于4米,则按以下方式收费: 前两天免费(或一次性10美元),然后 未来3天:每天5美元 未来4天:每天8美元 未来2天:每天10美元 后天:每天15美元 所以如果我呆8天,我会付2*0+3*5+3*8=36美元 我最初的逻辑是: 那就取消自由日吧 对于每个括号:检查是否还有天数,如果天数超过当前括号跨度,求和最大金额并继续,否则仅求和剩余金额 我的问题是:这种逻辑是否可以改进?(是否有更智能的算法) 什么样的数据结构能够以我在执行算法时可以行走的方式

例如,停车场对不同车辆收费,如果车辆长度小于4米,则按以下方式收费:

  • 前两天免费(或一次性10美元),然后
  • 未来3天:每天5美元
  • 未来4天:每天8美元
  • 未来2天:每天10美元
  • 后天:每天15美元
所以如果我呆8天,我会付2*0+3*5+3*8=36美元

我最初的逻辑是:

  • 那就取消自由日吧
  • 对于每个括号:检查是否还有天数,如果天数超过当前括号跨度,求和最大金额并继续,否则仅求和剩余金额
  • 我的问题是:这种逻辑是否可以改进?(是否有更智能的算法)

    什么样的数据结构能够以我在执行算法时可以行走的方式保存电费信息?我在数据库中看到数据表示为一个表,带有(car,free days,方括号_span_1,amount_span_1,方括号_span_2,amount_span_2…[但它不够通用],过去我尝试使用字典{car:{free:2,[span_1:[days:2,amount:5],…]),但我并不真正喜欢这个解决方案,因此产生了这个问题


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

    只需将括号中的天数和费率作为键/值对放入一个数组中,然后循环计算汽车停放的天数

    $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;
    
    $方括号=数组(0=>0,2=>5,5=>8,9=>10,11=>15);//在0天时,费率为0,从第2天起,费率为每天5美元等
    $days=8;
    $total=0;
    对于($i=0;$i<$days;++$i){//每天循环一次
    如果(isset($括号[$i])){
    $rate=$方括号[$i];//如果适用,设置新的费率
    }
    $total=$total+$rate;//将每日费率添加到总计
    }
    echo“总计为$”。$Total;
    
    您可以像项目符号列表中所描述的那样对括号进行编码,使用成对的[下一个”天数,这些天数的成本]。然后您最多需要与不同括号的数量相等的迭代次数。因此,即使一辆车停了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";
    
    $方括号=[[2,0]、[3,5]、[4,8]、[2,10]、[PHP_INT_MAX,15];
    $days=8;
    $total=0;
    foreach($括号为列表($nextDays,$dayFee)){
    $total+=min($nextDays,$days)*$dayFee;
    $days-=$nextDays;
    
    如果($days)很好,很简单!我按照你的建议做了一个测试数组,它很简单,我想知道我是否想得太多了:D明天我尝试完整的解决方案,如果我接受答案。。。