3 import Data.Traversable
4 import Control.Applicative
11 let params = map (read :: String -> Int) $ words line1
12 let required = params !! 1
13 let machines = map read $ words line2
16 print $ solve required machines
18 solve :: Int -> [Int] -> Int
19 solve required machines
20 | required <= minProduction = minTime -- (required, minTime, minTime)
21 | otherwise = binarySearchTime required minTime maxTime machines
22 where minTime = minimum machines
23 minProduction = productionAtTime minTime machines
24 maxTime = findMaxTime required minTime machines
26 findMaxTime :: Int -> Int -> [Int] -> Int
27 findMaxTime required minTime machines
28 | required <= productionAtTime maxTime machines = maxTime
29 | otherwise = findMaxTime required maxTime machines
30 where maxTime = minTime * 2
32 binarySearchTime required minTime maxTime machines
33 | minTime == maxTime = minTime
34 | midProduction < required = binarySearchTime required (midTime + 1) maxTime machines
35 | midProduction >= required = binarySearchTime required minTime midTime machines
36 where midTime = (minTime + maxTime) `div` 2
37 midProduction = productionAtTime midTime machines
39 productionAtTime :: Int -> [Int] -> Int
40 productionAtTime time machines = sum $ fmap go machines
41 where go machine = time `div` machine