TGViewer
PHP | LeetCode PHP | LeetCode @easy_php_task · 1.33K subscribers
Post #1124 145
Задача: 1058. Minimize Rounding Error to Meet Target
Сложность: medium

Учитывая массив цен [p1,p2...,pn] и цель, округлите каждую цену pi до Roundi(pi) так, чтобы округленный массив [Round1(p1),Round2(p2)...,Roundn(pn)] в сумме достиг заданной цели. Каждая операция Roundi(pi) может быть либо Floor(pi), либо Ceil(pi). Верните строку "-1", если округленный массив невозможно привести к целевому значению. В противном случае возвращается наименьшая ошибка округления, которая определяется как Σ |Roundi(pi) - (pi)| для i от 1 до n, в виде строки с тремя местами после десятичной дроби.

Пример:
Input: prices = ["0.700","2.800","4.900"], target = 8
Output: "1.000"


👨‍💻 Алгоритм:

1⃣Округли каждую цену вниз и вычисли текущую сумму округленных цен.
Найди разницу между целевой суммой и текущей суммой.

2⃣Определи количество округлений вверх, необходимых для достижения целевой суммы.
Если разница отрицательная или больше количества элементов в массиве, верни "-1".

3⃣Вычисли ошибки округления для всех элементов и отсортируй их по возрастанию.
Выбери необходимые округления вверх и вычисли общую ошибку округления.

😎 Решение:
function minimizeRoundingError($prices, $target) {
$floors = array_map(function($p) { return floor(floatval($p)); }, $prices);
$totalFloor = array_sum($floors);

$difference = $target - $totalFloor;
if ($difference < 0 || $difference > count($prices)) {
return "-1";
}

$roundingErrors = [];
foreach ($prices as $i => $p) {
$floatP = floatval($p);
$roundingErrors[] = [ceil($floatP) - $floors[$i], $floatP - $floors[$i]];
}

usort($roundingErrors, function($a, $b) {
return $a[1] <=> $b[1];
});

$roundingErrorSum = 0;
foreach ($prices as $i => $p) {
$roundingErrorSum += ($floors[$i] - floatval($p));
}

for ($i = 0; $i < $difference; $i++) {
$roundingErrorSum += $roundingErrors[$i][1];
}

return number_format($roundingErrorSum, 3, '.', '');
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_php_task
  1. Oct 15, 2026Задача: 474. Ones and Zeroes Сложность: medium Дан массив двоичных строк strs и два целых…
  2. Oct 15, 2026Задача: 1273. Delete Tree Nodes Сложность: medium Дерево, укорененное в узле 0, задано сле…
  3. Oct 14, 2026Задача: 724. Find Pivot Index Сложность: easy Если задан массив целых чисел nums, вычислит…
  4. Oct 14, 2026Задача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированн…
  5. Oct 13, 2026Задача: 899. Orderly Queue Сложность: hard Вам дана строка s и целое число k. Вы можете вы…
  6. Oct 11, 2026Задача: 913. Cat and Mouse4 Сложность: hard В игру на неориентированном графе играют два и…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →