Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΡ β 2226. Maximum Candies Allocated to K Children.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ ΠΌΠ°ΡΡΠΈΠ² candies
, Π³Π΄Π΅ candies[i]
β ΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅Ρ Π² i
-ΠΉ ΠΊΡΡΠ΅. ΠΡΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΡΡ k
Π΄Π΅ΡΡΠΌ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅Π±ΡΠ½ΠΎΠΊ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅Ρ ΠΈ Π²ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅Π±ΡΠ½ΠΊΠ° Π±ΡΠ»ΠΈ Π²Π·ΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΊΡΡΠΈ.
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅Ρ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅Π±ΡΠ½ΠΎΠΊ.
π‘ ΠΠ΄Π΅Ρ
ΠΠ΅ΡΠ΅Π±ΠΎΡ Π²ΡΠ΅Ρ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠΌ ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΏΠΎ ΠΎΡΠ²Π΅ΡΡ:
- ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅Ρ Π½Π° ΡΠ΅Π±ΡΠ½ΠΊΠ° β
0
,
- ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ β
total_candies / k
(ΡΡΡ total_candies
β ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅Ρ).
ΠΡΠ΄Π΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π²ΡΠ΄Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ΅Π±ΡΠ½ΠΊΡ candies_per_child
ΠΊΠΎΠ½ΡΠ΅Ρ.
ΠΡΠ»ΠΈ Π΄Π°, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ candies_per_child
, ΠΈΠ½Π°ΡΠ΅ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ.
π ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°
- ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ
total_candies
β ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅Ρ.
- Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π±ΡΡΡΡΠΎΠ³ΠΎ Π²ΡΡ
ΠΎΠ΄Π°: Π΅ΡΠ»ΠΈ
total_candies < k
, ΡΡΠ°Π·Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ 0
.
- ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ
can_share
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ candies_per_child
ΠΊΠΎΠ½ΡΠ΅Ρ Π½Π° k
Π΄Π΅ΡΠ΅ΠΉ.
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΡΡΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π΅ΡΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΊΠΎΡΠΌΠΈΡΡ,
- ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Ρ
Π²Π°ΡΠΈΡ Π»ΠΈ Π²ΡΠ΅Ρ
ΠΊΡΡΠ΅ΠΊ Π΄Π»Ρ
k
Π΄Π΅ΡΠ΅ΠΉ.
- ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ Π½Π°
[0, total_candies / k + 1]
.
- ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ.
ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n log m)
, Π³Π΄Π΅
n
β Π΄Π»ΠΈΠ½Π° ΠΌΠ°ΡΡΠΈΠ²Π° candies,
m = total_candies / k
β Π²Π΅ΡΡ
Π½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ° Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°.
- ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡ:
O(1)
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
.
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
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