Skip to content

Instantly share code, notes, and snippets.

@ypsilon-takai
Created October 1, 2011 14:46
Show Gist options
  • Save ypsilon-takai/1256133 to your computer and use it in GitHub Desktop.
Save ypsilon-takai/1256133 to your computer and use it in GitHub Desktop.
Code Jam Japan Problem B
(require '[clojure.contrib.io :as io])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Main funcs
;; sort coffee data by
;; : in descending order with satisfaction
;; : and in accending order with expiry date.
(defn sort-coffee-data [dat-list]
(sort (fn [d1 d2]
(cond (> (last d1) (last d2)) -1
(< (last d1) (last d2)) 1
:else (if (< (second d1) (second d2)) -1 1)))
dat-list))
(defn asign-coffee [coffee-dat K]
(let [[num due wgt] coffee-dat
P (if (> due K) K due)
n (if (> num P) P num)]
[(* wgt n) P n]))
(defn update-coffee-list [coffee-list P n]
(map (fn [[num due wgt]]
[num
(cond (> due P) (- due n)
(> due (- P n)) (- P n)
:else due)
wgt])
coffee-list))
(defn gcj-pB [key-arg coffee-list]
(let [[_ K] key-arg]
(loop [coffee-list (sort-coffee-data coffee-list)
total-days K
s-total 0]
(if (empty? coffee-list)
s-total
(let [[s-amount P n] (asign-coffee (first coffee-list) K)]
(recur (update-coffee-list (next coffee-list) P n)
(- K n)
(+ s-total s-amount)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Support funcs
;; get args from the question file.
;; returns them as
;; ((1 ((N K) ((c1 t1 s1)(c1 t1 s12)...))) (2 ........))
(defn get-gcj-args-list-pB [file-name]
(let [tmptmp
(reduce (fn [[tmp-dat res] dat]
(cond (= (count dat) 2) [[dat []] (conj res tmp-dat)]
(= (count dat) 3) [[(first tmp-dat) (vec (conj (second tmp-dat) dat))] res]
:final (vec (conj (second tmp-dat) dat))))
[[] []]
(map (fn [line-dat]
(map (fn [s] (BigInteger. s))
(.split line-dat " ")))
(drop 1 (io/read-lines file-name))))]
(map list
(iterate inc 1)
(conj (vec (drop 1 (second tmptmp))) (first tmptmp)))))
(defn gcj-get-ans-pB [file-name f]
(map (fn [[num args]] [num (apply f args)])
(get-gcj-args-list-pB file-name)))
(defn gcj-create-ans-pB [in-file out-file f]
(with-open [bw (io/writer out-file)]
(io/with-out-writer bw
(dorun
(for [[num ans] (gcj-get-ans-pB in-file f)]
(println (str "Case #" num ": " ans)))))))
;; (time (gcj-create-ans-pB "B-large-practice.in" "B-large-practice.out" gcj-pB))
;; time for large
;; "Elapsed time: 535.676461 msecs"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment