我是CodeChef的新手并想到尝试一些问题,所以我解决了"Bytelandian金币"问题.(http://www.codechef.com/problems/COINS/)我在计算机上获得即时结果,CodeChef设置了9秒的时间限制,但我仍然从CodeChef获取TimeOut.我不再有任何线索导致这种情况.任何提示都会有所帮助.
我的代码:
module Main where
import qualified Data.Map as M
import Data.Map (Map)
import Data.Maybe
main = do
catch (main' M.empty 1) (const $ return ())
main' _ 11 = return ()
main' m c = do
x <- readLn
let (k,m2) = sol m x
print k
main' m2 (c+1)
sol :: Map Integer Integer -> Integer -> (Integer, Map Integer Integer)
sol m x |M.member x m = (fromJust $ M.lookup x m,m)
|x > x2+x3+x4 = (x,M.insert x x m)
|otherwise = (fullSoll, M.insert x fullSoll m4)
where
x2 = div x 2
x3 = div x 3
x4 = div x 4
(sx2, m2) = sol m x2
(sx3, m3) = sol m2 x3
(sx4, m4) = sol m3 x4
fullSoll = sx2+sx3+sx4
Run Code Online (Sandbox Code Playgroud)
sol当你没有终止时x == 0.当x为1时它很好,因为所有x2, x3, x4都是0,并且它们的总和小于x,意味着第二个守卫是真的,并且没有递归.但是,当输入为0时,递归情况会启动,并且它永远不会终止.