一开始本想忽略独木桥上士兵的数量,结果第一个RE,事情并不简单...
学到了 when 的用法, 根据士兵的数量处理输入
module Main where
import Control.Monad (when)
import Control.Monad.Reader (MonadReader (ask), Reader, runReader)
main :: IO ()
main = do
theLengthOfTheSinglePlankBridge <- read <$> getLine
theNumberOfSoldiersLeftOnTheBridge <- read <$> getLine :: IO Int
when (theNumberOfSoldiersLeftOnTheBridge > 0) $ do
theCoordinatesOfTheSoldiers <- fmap read . words <$> getLine
putStrLn . unwords $ show . maximum
<$> ( (:) . (fmap (flip runReader theLengthOfTheSinglePlankBridge . minimumEvacuationTime))
<*> (return . fmap (flip runReader theLengthOfTheSinglePlankBridge . maximumEvacuationTime))
)
theCoordinatesOfTheSoldiers
when (theNumberOfSoldiersLeftOnTheBridge == 0) (putStrLn "0 0")
evacuationTime :: (Int -> Int -> Bool) -> Int {- PositionOnBridge -} -> Reader Int {- theLengthOfTheSinglePlankBridge -} Int
evacuationTime compare' position = do
lengthOfTheSinglePlankBridge <- ask
return $
if (position * 2) `compare'` lengthOfTheSinglePlankBridge
then position
else lengthOfTheSinglePlankBridge - position + 1
maximumEvacuationTime :: Int -> Reader Int Int
maximumEvacuationTime = evacuationTime (>)
minimumEvacuationTime :: Int -> Reader Int Int
minimumEvacuationTime = evacuationTime (<)