我是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
答案 0 :(得分:5)
sol
时x == 0
未终止。当x
为1时,它很好,因为所有x2, x3, x4
都是0,并且它们的总和小于x
,这意味着第二个保护是真的,没有递归。但是,当输入为0时,递归情况会启动,并且永远不会终止。