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
AC × 3
AC × 25
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