原题

算法思路(一)

题中一共有6桶酒,白酒5桶,红酒1桶,由于上午卖出了2桶白酒,下午卖出的白酒是上午的2倍,没有说明具体桶数,因而假设为n桶,n可为1-3。但从最小的2桶30,32相加之和为62升来看,2倍也就是124升,所以n只能是3,也就是说下午实际卖出了3桶白酒。在5桶白酒中,有3桶白酒的和是另外2桶白酒之和的2倍,那么这5桶白酒之和就能被3整除,即可得到这么一个逻辑:用6桶酒总和减去其中1桶酒(假设为红酒),剩下的5桶就即为白酒,相减后能被3整除,那么被减的这桶酒就为红酒。(这5个数之和能被3整除看不明白的可以点击这看看)

代码示例(一)

    //算出哪一桶是红酒    public function alcohol()    {            //6桶酒的升数数组        $arr = array(30, 32, 36, 38, 40, 62);        $len=count($arr);        //把6桶酒的升数求和        $sum=array_sum($arr);        //用6桶酒总和减去其中1桶酒(假设为红酒),那剩下的5桶就即为白酒,相减后能被3整除,那么被减的这桶酒就为红酒        for($n=0;$n<$len;$n++){            $red=$sum-$arr[$n];            if($red%3==0){                print_r('当前升数:'.$arr[$n].' 为红酒');            }        }    }

输出结果(一)

当前升数:40 为红酒

算法思路(二)

由于总共有六桶酒,其中白酒五桶,红酒一桶;那么也就是说,下午卖出的N桶白酒的升数是早上卖出的两桶白酒升数的两倍,由于没说明下午卖出了多少桶,所以N是不确定的,也就是N的范围是1-3;但是,从六桶酒可以知道,升数最小的是30升和32升,这两个数的和为62升,那么下午至少卖出124升,即N桶的升数不能小于124,再看看其他桶的升数,所以N只能是3;也就是最终知道,早上卖出两桶白酒,下午卖出三桶白酒,并且早上两桶白酒的升数的两倍等于下午卖出的三桶白酒的升数,然后剩下的一桶就是红酒了。

代码示例(二)

// 六桶酒的升数数组$arr = [30, 32, 36, 38, 40, 62];$len = count($arr);// 随机取两桶假设为白酒for ($i = 0; $i < $len-1; $i++) {    for ($j = 1 + $i; $j < $len; $j++) {        $twoArr = $arr;        // 去掉早上卖出的两桶白酒        unset($twoArr[$i]);        unset($twoArr[$j]);        $twoArr = array_values($twoArr);        // 从剩下的取出三桶假设为白酒        for ($n = 0; $n < $len - 4; $n++) {            for ($m = 1 + $n; $m < $len - 3; $m++) {                for ($p = 1 + $m; $p < $len - 2; $p++) {                    // 早上白酒总和                    $oneSum = $arr[$i] + $arr[$j];                    // 下午白酒总和                    $twoSum = $twoArr[$n] + $twoArr[$m] + $twoArr[$p];                    // 如果早上卖出白酒的升数的两倍等于下午卖出白酒的升数,那么即符合所求                    if ($oneSum * 2 == $twoSum) {                        echo '早上卖出的白酒是:' . $arr[$i] . '、'. $arr[$j] . '<br>';                        echo '下午卖出的白酒是:' . $twoArr[$n] . '、'. $twoArr[$m] . '、'. $twoArr[$p] . '<br>';                        echo '所有五桶白酒是:' . $arr[$i] . '、'. $arr[$j] . '、'. $twoArr[$n] . '、'. $twoArr[$m] . '、'. $twoArr[$p] . '<br>';                        $tmpArr = $twoArr;                        // 去掉下午卖出的三桶白酒                        unset($tmpArr[$n]);                        unset($tmpArr[$m]);                        unset($tmpArr[$p]);                        // 剩下的一桶就是所求红酒                        echo '一桶红酒是:' . current($tmpArr) . '<hr>';                    }                }            }        }    }}

输出结果(二)

早上卖出的白酒是:30、36<br>下午卖出的白酒是:32、38、62<br>所有五桶白酒是:30、36、32、38、62<br>一桶红酒是:40<hr>

总结分析

我这只列举了其中两种实现方式,当然还会有其他实现方式,欢迎留言区留言评论,写出算法思路+代码示例,语言不限。

相关资料

算法题之计算哪一桶是红酒