From 0060048b500174d2bb12128ec403b4798faedf73 Mon Sep 17 00:00:00 2001 From: Tim-tech-gif Date: Mon, 21 Oct 2024 14:44:42 +0300 Subject: [PATCH] Create Vec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Щоб реалізувати ці дві функції, спершу розглянемо алгоритм: Функція count_permutation(shipments: &Vec) -> usize: Необхідно підрахувати, скільки вантажу потрібно перемістити між кораблями, щоб на кожному було однаково. Для цього спочатку перевіряємо, чи можна взагалі зробити рівний розподіл. Якщо загальна кількість вантажу ділиться на кількість кораблів без залишку, можемо продовжити. Далі для кожного корабля, де вантажу більше за середній, обчислюємо, скільки потрібно перенести до кораблів з меншим вантажем. Функція gen_shipments(n: usize) -> Vec: Створюємо випадковий вектор розміру n, який можна розподілити рівномірно. Для цього задаємо випадкові значення вантажів, а потім обчислюємо, скільки вантажу потрібно додати або відняти, щоб сума була кратною кількості кораблів. Функція count_permutation: Спочатку обчислює загальну кількість вантажу на всіх кораблях. Перевіряє, чи можна рівномірно розподілити вантаж (чи сума ділиться на кількість кораблів без залишку). Підраховує загальну кількість перенесень, необхідних для вирівнювання вантажу. Функція gen_shipments: Генерує випадковий вектор вантажів для кораблів. Переконується, що сума вантажів кратна кількості кораблів шляхом коригування першого елемента. --- Vec | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Vec diff --git a/Vec b/Vec new file mode 100644 index 0000000..a4b8828 --- /dev/null +++ b/Vec @@ -0,0 +1,46 @@ +fn count_permutation(shipments: &Vec) -> usize { + let n = shipments.len(); + let total: u32 = shipments.iter().sum(); + + // Перевірка, чи можна рівномірно розподілити вантаж + if total as usize % n != 0 { + panic!("Неможливо розподілити вантаж рівномірно."); + } + + let avg = total / n as u32; + let mut imbalance = 0; + + // Рахуємо кількість переміщень вантажу + for &shipment in shipments { + if shipment > avg { + imbalance += shipment - avg; + } + } + + imbalance as usize +} + +use rand::Rng; + +fn gen_shipments(n: usize) -> Vec { + let mut rng = rand::thread_rng(); + let avg_load = rng.gen_range(10..50); // Випадкове середнє значення + let mut shipments: Vec = (0..n).map(|_| rng.gen_range(avg_load - 5..avg_load + 5)).collect(); + + // Коригуємо загальну суму, щоб вона ділилася на кількість кораблів + let total: u32 = shipments.iter().sum(); + let remainder = total % n as u32; + + if remainder != 0 { + shipments[0] += n as u32 - remainder; + } + + shipments +} + +fn main() { + let shipments = gen_shipments(5); + println!("Shipments: {:?}", shipments); + let moves = count_permutation(&shipments); + println!("Minimum moves: {}", moves); +}