liuxu
2022-02-20 23:58:38 +08:00
没有什么代码是 phper 用 for 和数组写不出来的,如果有,再加个 if/else
<?php
/* 输入 */
echo "请输入糖的个数: ";
$count = (int) fgets(STDIN);
echo "请输入每颗糖的重量:";
$tmp = fgets(STDIN);
$tmp = explode(' ', $tmp);
$weight_arr = [];
foreach($tmp as $v) {
array_push($weight_arr, (int) $v);
}
if ($count != count($weight_arr)) {
echo "请输入正确的重量\n";
exit();
}
/* 初始化 */
// 给孩子 A 的重量
$weight_a = 0;
// 给孩子 B 的重量
$weight_b = 0;
// 是否可以平分
$status = false;
// 日志,记录给孩子 A 和孩子 B 的分配方案
$log_plan_a = [];
$log_plan_b = [];
// 将输入的重量列表看作一个环,每次指针指向下位,$count/2 次向上取整即可
for ($n = 0; $n < ceil($count/2) /*$count*/; $n++) {
// 将糖果分为 2 个部分,前$i 个给孩子 A ,后$count - $i 个给孩子 B
// 给孩子 A 的
for ($i = 0; $i < $count - 1; $i++) {
// 奇数个中位数对比时也只需要对比一半
if ($n == ceil($count/2) - 1 && $i == ceil(($count - 1)/2)) {
$weight_b = 0;
$log_plan_b = [];
break;
}
$weight_a += $weight_arr[$i];
array_push($log_plan_a, $weight_arr[$i]);
// 给孩子 B 的
for ($j = $i + 1; $j < $count; $j++) {
$weight_b += $weight_arr[$j];
array_push($log_plan_b, $weight_arr[$j]);
}
if ($weight_a == $weight_b) {
$status = true;
echo '可行的分配方案,一个孩子给:' . implode(', ', $log_plan_a) . '。另一个孩子给:' . implode(', ', $log_plan_b) . "\n";
}
$weight_b = 0;
$log_plan_b = [];
}
$tmp = array_shift($weight_arr);
array_push($weight_arr, $tmp);
$weight_a = 0;
$log_plan_a = [];
}
if ($status) {
echo "1\n";
} else {
echo "0\n";
}