AtCoder Beginner Contest 141 D問題
https://atcoder.jp/contests/abc141/tasks/abc141_d
昨日のAtCoderD問題は割引券の問題で、
簡単にいえば使用すれば何回でも半額になる割引券をいかに効率よく適用させていくかの問題になります。
割引を効率よく適用させるには、都度都度最大値の品物を取得する必要があるのですが
そのために、要素の追加、最大値の取得がそれぞれlogNと1でできる優先度付きキュー(PriorityQueue)を使用します。
(今回の解説を読んで初めて知った)
というわけで以下のようにPriorityQueueをインスタンス化します。
val tmpQueue: Queue<Int> = PriorityQueue<Int>() { i1: Int, i2: Int ->
return@PriorityQueue i2 - i1
}
これでローカル上では完璧に動いた!と思ったのですが、AtCoderのジャッジサーバではコンパイルエラーが発生します。
Main.kt:16:32: error: none of the following functions can be called with the arguments supplied:
調べた所、Comparatorのみを渡してPriorityQueueをインスタンス化するコンストラクタはJava1.8から入ったそうで、もしやと思い、Java1.8よりも前からあるPriorityQueue(int initialCapacity, Comparator super E> comparator)を使用した所、コンパイルエラーが解消されました。
val tmpQueue: Queue<Int> = PriorityQueue<Int>(size) { i1: Int, i2: Int ->
return@PriorityQueue i2 - i1
}
そういえばジャッジサーバのランタイムバージョンを知らないなぁと思って、システム情報を出力するプログラムをちゃちゃっと書いて確かめてみる。
fun main(args: Array<String>) {
for ((key,value) in System.getProperties()) {
println("key -> $key value -> $value")
}
}
以下その結果
key -> java.runtime.name value -> OpenJDK Runtime Environment
key -> sun.boot.library.path value -> /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64
key -> java.vm.version value -> 24.121-b00
key -> java.vm.vendor value -> Oracle Corporation
key -> java.vendor.url value -> http://java.oracle.com/
key -> path.separator value -> :
key -> java.vm.name value -> OpenJDK 64-Bit Server VM
key -> file.encoding.pkg value -> sun.io
key -> user.country value -> US
key -> sun.java.launcher value -> SUN_STANDARD
key -> sun.os.patch.level value -> unknown
key -> java.vm.specification.name value -> Java Virtual Machine Specification
key -> user.dir value -> /imojudge
key -> java.runtime.version value -> 1.7.0_121-b00
key -> java.awt.graphicsenv value -> sun.awt.X11GraphicsEnvironment
key -> java.endorsed.dirs value -> /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/endorsed
key -> os.arch value -> amd64
key -> java.io.tmpdir value -> /tmp
key -> line.separator value ->
key -> kotlin.home value -> /opt/kotlinc
key -> java.vm.spec...
やっぱりランタイムはJava1.7でした。
ということはJava1.8で追加されたメソッド類は使えません。
今後気をつけなければ。。。
参考リンク