結果

問題 No.168 ものさし
ユーザー バカらっくバカらっく
提出日時 2019-11-29 09:48:24
言語 Kotlin
(1.9.10)
結果
RE  
実行時間 -
コード長 2,282 bytes
コンパイル時間 16,308 ms
コンパイル使用メモリ 429,316 KB
実行使用メモリ 57,968 KB
最終ジャッジ日時 2023-08-13 04:40:12
合計ジャッジ時間 28,002 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 AC 326 ms
57,228 KB
testcase_03 RE -
testcase_04 AC 328 ms
57,368 KB
testcase_05 AC 331 ms
57,396 KB
testcase_06 RE -
testcase_07 RE -
testcase_08 AC 334 ms
57,252 KB
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
Main.kt:4:10: warning: parameter 'arr' is never used
fun main(arr:Array<String>) {
         ^

ソースコード

diff #

import java.math.BigDecimal
import java.util.*

fun main(arr:Array<String>) {
    val pointCount = readLine()!!.toInt()
    var list = (1..pointCount).map {id -> readLine()!!.split(" ").map { it.toLong() }.let { Point(id, it[0].toDouble(), it[1].toDouble()) } }.toMutableList()
    list.forEach {
        it.distanceStart =  dist(it, list.first())
        it.distanceGoal = dist(it, list.last())
    }
    val startPoint = list.first()
    val goalPoint = list.last()

    list = list.filter { it.distanceGoal <= startPoint.distanceGoal && it.distanceStart <= goalPoint.distanceStart }.sortedBy { it.distanceStart }.toMutableList()
    val map = PriorityQueue<Point>(kotlin.Comparator { t, t2 -> t.distanceStart.compareTo(t2.distanceStart) })
    map.add(list.first())
    list.removeAt(0)

    for(p in list) {
        for(p2 in map) {
            val d = dist(p2, p)
            if(d <= p2.distanceStart) {
                p.distanceStart = p2.distanceStart
                break
            } else if(d < p.distanceStart) {
                p.distanceStart = d
            }
        }
        map.add(p)
    }
    println(goalPoint.distanceStart)
}

fun dist(p1:Point, p2:Point):Long {
    var dist = Math.pow(Math.abs(p1.x - p2.x), 2.toDouble()).toBigDecimal()
    dist += Math.pow(Math.abs(p1.y - p2.y), 2.toDouble()).toBigDecimal()
    var ret = bigSqrt(dist, 0.toBigDecimal(), dist)
    ret = (Math.ceil(ret.toDouble() / 10) * 10).toLong()
    return ret.toLong()
}

fun bigSqrt(num:BigDecimal, min:BigDecimal, max:BigDecimal):Long {
    val mid = (max+min)/2.toBigDecimal()
    if(max-min<= 2.toBigDecimal()) {
        val minl = min.toLong()
        val midl = mid.toLong()
        val maxl = max.toLong()
        if(minl * minl >= num.toLong()) {
            return minl
        }
        if(midl * midl >= num.toLong()) {
            return midl
        }
        if(maxl * maxl >= num.toLong()) {
            return maxl
        }
        return  maxl + 1
    }
    var newMin = min;
    var newMax = max
    if(mid * mid > num) {
        newMax = mid + 1.toBigDecimal()
    } else {
        newMin = mid
    }
    return bigSqrt(num, newMin, newMax)
}
class Point(val id:Int, val x:Double, val y:Double) {
    var distanceStart: Long = 0
    var distanceGoal:Long = 0
}
0