From a5b3c50bd794b18a0722cd7145b9673ee3a2c659 Mon Sep 17 00:00:00 2001 From: Tim-tech-gif Date: Mon, 21 Oct 2024 14:50:57 +0300 Subject: [PATCH] Create average MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Функція, яка рівномірно розподіляє кількість поцінків між різними значеннями, виглядатиме приблизно так. Ми будемо прагнути до того, щоб сума всіх елементів масиву була максимально близькою до середнього. Початкова кількість партій: Беремо масив shipments, який представляє наявну кількість партій. Середнє значення: Обчислюємо середнє значення партій. Корекції: Визначаємо, наскільки кожна партія відхиляється від середнього, і поступово зменшуємо або збільшуємо відхилення, щоб отримати розподіл, що якнайближче до рівномірного. Результат: Повертаємо новий відкоригований масив. Ваша початкова сума 20 та середнє значення 4 для масиву [8, 2, 2, 4, 4] після цієї операції дасть розподіл ближче до рівномірного, де елементи вирівняються. --- average | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 average diff --git a/average b/average new file mode 100644 index 0000000..44a8f77 --- /dev/null +++ b/average @@ -0,0 +1,30 @@ +fn gen_shipments(mut shipments: Vec) -> Vec { + let total: u32 = shipments.iter().sum(); + let average = total as i32 / shipments.len() as i32; + + let mut adjustments: Vec = shipments.iter().map(|&x| x as i32 - average).collect(); + + // Перевіримо, чи загальний залишок не більше нуля (щоб врівноважити). + let excess: i32 = adjustments.iter().sum(); + + for i in 0..adjustments.len() { + if excess == 0 { + break; + } + if excess > 0 && adjustments[i] > 0 { + adjustments[i] -= 1; + } else if excess < 0 && adjustments[i] < 0 { + adjustments[i] += 1; + } + } + + // Перетворимо значення назад в Vec + let result: Vec = adjustments.iter().map(|&x| (x + average) as u32).collect(); + result +} + +fn main() { + let shipments = vec![8, 2, 2, 4, 4]; + let result = gen_shipments(shipments); + println!("{:?}", result); +}