haskell 初学者踩坑,警示后人
  • 板块P1007 独木桥
  • 楼主_OTZ_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/5 00:02
  • 上次更新2024/10/5 10:21:20
查看原帖
haskell 初学者踩坑,警示后人
625398
_OTZ_楼主2024/10/5 00:02

一开始本想忽略独木桥上士兵的数量,结果第一个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 (<)
2024/10/5 00:02
加载中...