Submission #37468022
Source Code Expand
#!/usr/bin/env stack
{- stack script --resolver lts-16.11
--package array --package bytestring --package containers
--package vector --package vector-algorithms --package primitive --package transformers
-}
{- ORMOLU_DISABLE -}
{-# LANGUAGE BangPatterns, BlockArguments, LambdaCase, MultiWayIf, PatternGuards, TupleSections #-}
{-# LANGUAGE NumDecimals, NumericUnderscores #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, ScopedTypeVariables, TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{- ORMOLU_ENABLE -}
-- {{{ Imports
module Main (main) where
import Control.Monad
import Control.Monad.ST
import Data.Char
import Data.List
{- ORMOLU_DISABLE -}
-- array
import Data.Array.IArray
import Data.Array.IO
import Data.Array.MArray
import Data.Array.ST
import Data.Array.Unsafe
-- import qualified Data.Array as A
import Data.Array.Unboxed (UArray)
-- bytestring: https://www.stackage.org/lts-16.11/package/bytestring-0.10.10.0
import qualified Data.ByteString.Char8 as BS
-- vector: https://www.stackage.org/lts-16.11/package/vector-0.12.1.2
import qualified Data.Vector.Unboxed as VU
{- ORMOLU_ENABLE -}
getLineIntList :: IO [Int]
getLineIntList = unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
getLineIntVec :: IO (VU.Vector Int)
getLineIntVec = VU.unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
-- TODO: use type parameter `e`
-- {-# INLINE tabulateST #-}
tabulateST :: forall i. (Ix i) => (forall s. MArray (STUArray s) Int (ST s) => STUArray s i Int -> i -> ST s Int) -> (i, i) -> Int -> UArray i Int
tabulateST f bounds_ e0 =
runSTUArray uarray
where
uarray :: forall s. MArray (STUArray s) Int (ST s) => ST s (STUArray s i Int)
uarray = do
tbl <- newArray bounds_ e0 :: ST s (STUArray s i Int)
forM_ (range bounds_) $ \i -> do
e <- f tbl i
writeArray tbl i e
return tbl
main :: IO ()
main = do
[nItems, wLimit] <- getLineIntList
wvs <- VU.replicateM nItems $ (\[a, b] -> (a, b)) <$> getLineIntList
let dp = tabulateST f rng (0 :: Int)
rng = ((0, 0), (nItems, wLimit))
-- TODO: type of `f` should be inferred
f :: forall s. MArray (STUArray s) Int (ST s) => STUArray s (Int, Int) Int -> (Int, Int) -> (ST s) Int
f _ (0, _) = return 0
f arr (i, w) = do
let wv = wvs VU.! (i - 1)
v1 <- readArray arr (i - 1, w)
v2 <- if w - fst wv >= 0 then (snd wv +) <$> readArray arr (i - 1, w - fst wv) else return 0
return $ max v1 v2
print $ maximum [dp ! (nItems, w) | w <- [0 .. wLimit]]
Submission Info
Submission Time |
|
Task |
A19 - Knapsack 1 |
User |
toyboot4e |
Language |
Haskell (GHC 8.8.3) |
Score |
1000 |
Code Size |
2615 Byte |
Status |
AC |
Exec Time |
170 ms |
Memory |
83792 KiB |
Compile Error
Loaded package environment from /home/contestant/.ghc/x86_64-linux-8.8.3/environments/default
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
1000 / 1000 |
Status |
|
|
Set Name |
Test Cases |
Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
All |
in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, sample_01.txt, sample_02.txt, sample_03.txt |
Case Name |
Status |
Exec Time |
Memory |
in01.txt |
AC |
13 ms |
6216 KiB |
in02.txt |
AC |
26 ms |
13324 KiB |
in03.txt |
AC |
30 ms |
13328 KiB |
in04.txt |
AC |
29 ms |
13320 KiB |
in05.txt |
AC |
25 ms |
13248 KiB |
in06.txt |
AC |
31 ms |
13352 KiB |
in07.txt |
AC |
163 ms |
83792 KiB |
in08.txt |
AC |
161 ms |
83564 KiB |
in09.txt |
AC |
162 ms |
83752 KiB |
in10.txt |
AC |
165 ms |
83560 KiB |
in11.txt |
AC |
163 ms |
83632 KiB |
in12.txt |
AC |
169 ms |
83672 KiB |
in13.txt |
AC |
169 ms |
83652 KiB |
in14.txt |
AC |
170 ms |
83792 KiB |
in15.txt |
AC |
170 ms |
83540 KiB |
in16.txt |
AC |
170 ms |
83564 KiB |
in17.txt |
AC |
31 ms |
13360 KiB |
in18.txt |
AC |
30 ms |
13244 KiB |
in19.txt |
AC |
25 ms |
13244 KiB |
in20.txt |
AC |
165 ms |
83560 KiB |
in21.txt |
AC |
161 ms |
83676 KiB |
in22.txt |
AC |
161 ms |
83640 KiB |
sample_01.txt |
AC |
3 ms |
3616 KiB |
sample_02.txt |
AC |
2 ms |
3672 KiB |
sample_03.txt |
AC |
2 ms |
3736 KiB |