Created
October 1, 2011 14:46
-
-
Save ypsilon-takai/1256133 to your computer and use it in GitHub Desktop.
Code Jam Japan Problem B
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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