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

算法原题

莫斯科的一位酒商现有六桶酒,容量分别为30升、32升、36升、38升、40升、62升。白酒五桶,红酒一桶。他的酒都是整桶出售,上午卖出了两桶白酒,下午卖出的白酒是上午的两倍。请问:红酒是哪一桶?

算法思路

由于总共有六桶酒,其中白酒五桶,红酒一桶;那么也就是说,下午卖出的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>';
                    }
                }
            }
        }
    }
}
复制代码

最后

这只我的一种思路和实现方法,算法也不是很优,其他的实现算法还有很多,欢迎大家评论留言,实现语言和方式不限,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值