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

Бсылка Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ β€” 2226. Maximum Candies Allocated to K Children.

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

Π”Π°Π½ массив candies, Π³Π΄Π΅ candies[i] β€” это количСство ΠΊΠΎΠ½Ρ„Π΅Ρ‚ Π² i-ΠΉ ΠΊΡƒΡ‡Π΅. НуТно Ρ€Π°Π·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π΅Ρ‚Ρ‹ k дСтям Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π±Ρ‘Π½ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство ΠΊΠΎΠ½Ρ„Π΅Ρ‚ ΠΈ всС ΠΊΠΎΠ½Ρ„Π΅Ρ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π΅Π±Ρ‘Π½ΠΊΠ° Π±Ρ‹Π»ΠΈ взяты ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΊΡƒΡ‡ΠΈ.
ВрСбуСтся Π½Π°ΠΉΡ‚ΠΈ максимальноС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ количСство ΠΊΠΎΠ½Ρ„Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π±Ρ‘Π½ΠΎΠΊ.

πŸ’‘ ИдСя

ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² распрСдСлСния нСэффСктивСн. ВмСсто этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ поиском ΠΏΠΎ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ:

Π‘ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ‘Π½ΠΊΡƒ candies_per_child ΠΊΠΎΠ½Ρ„Π΅Ρ‚.
Если Π΄Π°, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ candies_per_child, ΠΈΠ½Π°Ρ‡Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ.

πŸ›  ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

  1. ВычисляСм total_candies β€” суммарноС количСство ΠΊΠΎΠ½Ρ„Π΅Ρ‚.
  2. УсловиС быстрого Π²Ρ‹Ρ…ΠΎΠ΄Π°: Ссли total_candies < k, сразу Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0.
  3. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ can_share, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ candies_per_child ΠΊΠΎΠ½Ρ„Π΅Ρ‚ Π½Π° k Π΄Π΅Ρ‚Π΅ΠΉ.
    • Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΡƒΡ‡ΠΈ считаСм, сколько Π΄Π΅Ρ‚Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΊΠΎΡ€ΠΌΠΈΡ‚ΡŒ,
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π»ΠΈ всСх ΠΊΡƒΡ‡Π΅ΠΊ для k Π΄Π΅Ρ‚Π΅ΠΉ.
  4. ЗапускаСм Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π½Π° [0, total_candies / k + 1].
  5. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ максимум.

Асимптотика

πŸ’» Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

impl Solution {
    pub fn maximum_candies(candies: Vec<i32>, k: i64) -> i32 {
        // Compute total number of candies to set the search upper bound
        let total_candies: i64 = candies.iter().map(|&c| c as i64).sum();

        // If not enough candies for all children, return 0 immediately
        if total_candies < k {
            return 0;
        }

        // Function to check if a given `candies_per_child` is feasible
        let can_share = |candies_per_child: i32| -> bool {
            candies_per_child == 0  // Prevent division by zero
            || candies.iter()
                .map(|&pile| (pile/candies_per_child) as i64)
                .sum::<i64>() >= k
        };

        // Binary search for the max possible candies per child
        Self::binary_search_last(0, (total_candies / k) as i32 + 1, can_share)
    }

    fn binary_search_last<F>(mut left: i32, mut right: i32, predicate: F) -> i32 
    where F: Fn(i32) -> bool {
        while left < right {
            let middle = left + (right - left + 1) / 2;
            if predicate(middle) {
                left = middle; // Middle is valid, search higher
            } else {
                right = middle - 1; // Middle is too high, search lower
            }
        }
        right
    }
}

Tags: #rust #algorithms #binarysearch