CodeChef上的TimeOut

时间:2011-01-12 11:23:29

标签: haskell

我是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

1 个答案:

答案 0 :(得分:5)

solx == 0未终止。当x为1时,它很好,因为所有x2, x3, x4都是0,并且它们的总和小于x,这意味着第二个保护是真的,没有递归。但是,当输入为0时,递归情况会启动,并且永远不会终止。