Haskell version(1.03 s):
module Main where
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Control.Monad
import Control.Applicative ((<$>))
import Data.Vector.Unboxed (Vector,(!))
import qualified Data.Vector.Unboxed as V
solve :: Vector Int -> Int
solve ar =
V.foldl' go 0 ar' where
ar' = V.zip ar (V.postscanr' max 0 ar)
go sr (p,m) = sr + m - p
main = do
t <- fmap (read . T.unpack) TIO.getLine -- With Data.Text, the example finishes 15% faster.
T.unlines . map (T.pack . show . solve . V.fromList . map (read . T.unpack) . T.words)
<$> replicateM t (TIO.getLine >> TIO.getLine) >>= TIO.putStr
F# version(0,17 s):
open System
let solve (ar : uint64[]) =
let ar' =
let t = Array.scanBack max ar 0UL |> fun x -> Array.take (x.Length-1) x
Array.zip ar t
let go sr (p,m) = sr + m - p
Array.fold go 0UL ar'
let getIntLine() =
Console.In.ReadLine().Split [|' '|]
|> Array.choose (fun x -> if x <> "" then uint64 x |> Some else None)
let getInt() = getIntLine().[0]
let t = getInt()
for i=1 to int t do
getInt() |> ignore
let ar = getIntLine()
printfn "%i" (solve ar)
Les deux programmes sont les solutions pour le Stock de Maximiser le problème et le temps sont pour le premier test de l' Run Code
bouton.
Pour une raison quelconque, le F# version est d'environ 6x plus rapide, mais je suis sûr que si je l'ai remplacé la lenteur des fonctions de la bibliothèque avec l'impératif de boucles que j'ai pu accélérer par au moins 3 fois et plus susceptibles de 10x.
Pourrait le Haskell version en être de même améliorée?
Je suis en train de faire le ci-dessus à des fins d'apprentissage et, en général, je trouve qu'il est difficile de comprendre comment écrire efficace du code Haskell.