[Haskell-beginners] : GCJ 2015 - Round 1A Problem - Haircut

Gregory Guthrie guthrie at mum.edu
Mon Apr 27 02:38:37 UTC 2015


Seems to me that an estimate won't help, one has to know exactly how much to skip over.

I did this:
   Find the lowest common multiple (lcm), and then from that the shortest cycle of services,
   And then skip any multiple of those from the customer queue.

sim :: Problem -> [Result]
sim (n, ts) = serve tSkip (servers ts)
    --  optimize; skip ahead over server cycles...
    where tsLcm  = (foldl lcm $ head ts) $ tail ts
          tCycle = sum $ map (div tsLcm) ts
          tSkip  = n - (div n tCycle)*tCycle

(Some fixup is needed for tSkip=0, one easy one is to force an extra cycle.)
> ----------------------------------------------------------------------
> Message: 1
> Date: Sat, 18 Apr 2015 10:29:11 -0400
> From: Doug McIlroy <doug at cs.dartmouth.edu>
> To: sourabh.s.joshi at gmail.com
> Cc: beginners at haskell.org
> Subject: Re: [Haskell-beginners] GCJ 2015 - Round 1A Problem - Haircut
> Message-ID: <201504181429.t3IETBfo025201 at coolidge.cs.dartmouth.edu>
> Content-Type: text/plain; charset=us-ascii
> 
> > Can someone tell me how I could have avoided or fixed this?
> 
> The trouble manifested as stack overflow on solving
> 
> > https://code.google.com/codejam/contest/4224486/dashboard#s=p1
> 
> For efficiency, you'll probably need more cleverness in math than in Haskell. You can predict
> an approximate start time for the Nth customer's service from the average per-customer
> service time M, where 1/M = sum 1/M_k.
> Starting from that estimate, one can skip over almost the entire service simulation.
> 
> Doug McIlroy
> 
> 


More information about the Beginners mailing list