二分法查找区间并统计数据
发表于 2021-4-9 | | 开发笔记
题目:
假设购买份数在1-5份内,价格为30,
假设购买份数在6-10份内,价格为15,
假设购买份数在11-20份内,价格为10,
假设购买份数在21-50份内,价格为9,
假设购买份数在51-100份内,价格为8,
假设购买份数在101-200份内,价格为7,
假设购买份数在201-500份内,价格为6,
假设购买份数在501-1000份内,价格为5,
假设购买份数在1001-2000份内,价格为4,
假设购买份数在2001-4000份内,价格为3,
假设购买份数在4001-6000份内,价格为2,
6001及以上,价格为1
如:购买6份,价格就等于5*30 +(6-5)*15 = 165
 
<?php
function search($array, $value, $low = 0, $high = 0){
    // 初始化赋初值
    if($array[count($array) -1] < $value){
        return count($array); 
    }
    if($high == 0 && count($array) > 0){
        $high = count($array);
    }

    if($low <= $high){       // 左边坐标 不能大于 右边坐标
        // 找到中间坐标
        $mid = floor(($low + $high) / 2);

        if($array[$mid] == $value){     // 中间坐标的值刚好等于要查找的值,直接返回坐标
            return $mid;
        }else if($array[$mid] > $value){     // 中间坐标的值 比 要查找的值 大,进入左边继续查找
            return search($array, $value, $low, $mid-1);
        }else{      // 反之,中间坐标的值 比 要查找的值 小,进入右边继续查找
            return search($array, $value, $mid+1, $high);
        }

    }
    //返回最右区间
    return $high + 1;
}

$array = array(0, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 4000, 6000);
$price = array(30, 15, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
// var_dump(search($array, 11));
$n = 6001;
$area = search($array,$n);
echo $area;
$total = 0;
for($i = 0; $i < $area - 1; $i++ ){
    $total += ($array[$i+1] - $array[$i]) * $price[$i];
}
var_dump($total);
if($array[$area] != $n){
  $total += ($n - $array[$area - 1]) * $price[$area - 1];  
} 
var_dump($total);

发表评论:

TOP