LeetCode 1962. Remove Stones to Minimize the Total in F#

URL

Remove Stones to Minimize the Total - LeetCode

Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/problems/1962/main.fsx

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

let minStoneSum (piles: int list) (k: int) : int =
    let rec sumQueue (q: IPriorityQueue<int>) acc : int =
        match (PriorityQueue.tryPop q) with
        | None -> acc
        | Some(v, q') -> sumQueue q' (v + acc)

    let rec minStoneSum' (q: IPriorityQueue<int>) (k: int) =
        if k = 0 then
            sumQueue q 0
        else
            let v, q' = PriorityQueue.pop q
            let q'' = PriorityQueue.insert (v - (v / 2)) q'
            minStoneSum' q'' (k - 1)

    let q =
        piles
        |> List.fold (fun acc n -> PriorityQueue.insert n acc) (PriorityQueue.empty true)

    minStoneSum' q k