Help us understand the problem. What is going on with this article?

AtCoderのkotlin(1.0.0)でPriorityQueueを使う(+ ジャッジサーバの環境を調査)

AtCoder Beginner Contest 141 D問題

https://atcoder.jp/contests/abc141/tasks/abc141_d
昨日のAtCoderD問題は割引券の問題で、
簡単にいえば使用すれば何回でも半額になる割引券をいかに効率よく適用させていくかの問題になります。

割引を効率よく適用させるには、都度都度最大値の品物を取得する必要があるのですが
そのために、要素の追加、最大値の取得がそれぞれlogNと1でできる優先度付きキュー(PriorityQueue)を使用します。
(今回の解説を読んで初めて知った)

というわけで以下のようにPriorityQueueをインスタンス化します。

Main.kt
    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)を使用した所、コンパイルエラーが解消されました。

Main.kt
    val tmpQueue: Queue<Int> = PriorityQueue<Int>(size) { i1: Int, i2: Int ->
        return@PriorityQueue i2 - i1
    }

そういえばジャッジサーバのランタイムバージョンを知らないなぁと思って、システム情報を出力するプログラムをちゃちゃっと書いて確かめてみる。

CodeTest.kt
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で追加されたメソッド類は使えません。

今後気をつけなければ。。。

参考リンク

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした