главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

Бсылка Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ β€” 2551. Put Marbles in Bags.

πŸ“Œ ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ

πŸ’‘ ИдСя

ΠŸΡ€ΠΈ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ Π½Π° k подряд ΠΈΠ΄ΡƒΡ‰ΠΈΡ… мСшков ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ k - 1 Ρ€Π°Π·Ρ€Π΅Π· ΠΌΠ΅ΠΆΠ΄Ρƒ кусками.
ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π΅Π· влияСт Π½Π° ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сумму Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Ρ‹ Π²ΠΈΠ΄Π° weights[i] + weights[i+1],
Π³Π΄Π΅ i β€” индСкс послСднСго элСмСнта Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ мСшкС.

explanation.png

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, вся Π·Π°Π΄Π°Ρ‡Π° сводится ΠΊ Π²Ρ‹Π±ΠΎΡ€Ρƒ k - 1 ΠΏΠ°Ρ€ сосСдних кусков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅:

🧩 Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. ΠŸΠΎΡΡ‡ΠΈΡ‚Π°Π΅ΠΌ суммы всСх ΠΏΠ°Ρ€ сосСдних кусков: weights[i] + weights[i+1]
  2. ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ суммы.
  3. Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ:
    • k - 1 Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… сумм для минимального Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°,
    • k - 1 Π½Π°ΠΈΠ±ΠΎΠ»ΡŒΡˆΠΈΡ… для максимального.
  4. ΠžΡ‚Π²Π΅Ρ‚ β€” Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя суммами.

⏱️ Асимптотики

🧾 Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

impl Solution {
    pub fn put_marbles(weights: Vec<i32>, k: i32) -> i64 {
        let k = k as usize;

        // Compute pairwise sums of adjacent marbles
        let mut adjacent_sums: Vec<i64> = weights
            .windows(2)
            .map(|pair| pair[0] as i64 + pair[1] as i64)
            .collect();

        // Sort the adjacent sums to prepare for min/max partition costs
        adjacent_sums.sort_unstable();

        // To get the minimum score, pick the smallest (k-1) adjacent sums
        let min_score: i64 = adjacent_sums.iter().take(k - 1).sum();

        // To get the maximum score, pick the largest (k-1) adjacent sums
        let max_score: i64 = adjacent_sums.into_iter().rev().take(k - 1).sum();

        // The result is the difference between the maximum and minimum scores
        max_score - min_score
    }
}

Tags: #rust #algorithms #optimization