結果

問題 No.873 バイナリ、ヤバいなり!w
コンテスト
ユーザー バカらっく
提出日時 2019-09-05 02:36:49
言語 Kotlin
(2.3.20)
コンパイル:
kotlinc _filename_ -include-runtime -d main.jar
実行:
kotlin main.jar
結果
WA  
実行時間 -
コード長 1,909 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 8,923 ms
コンパイル使用メモリ 471,344 KB
実行使用メモリ 130,672 KB
最終ジャッジ日時 2026-03-10 05:51:21
合計ジャッジ時間 33,954 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 23 WA * 9 TLE * 4
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import java.lang.Math.sqrt
import java.lang.StringBuilder

fun main(args: Array<String>) {
    var n = readLine()!!.toInt()
    var list = getList(n)!!.sortedWith(Comparator { a, b -> com(a, b, true) })
    var prevChar = '0'
    val ans = StringBuilder()
    while (list.isNotEmpty()) {
        val word = getWord(prevChar == '0', list[0])
        ans.append(word)
        prevChar = word.last()
        list = list.drop(1).sortedWith(Comparator { a, b -> com(a, b, prevChar == '0') })
    }
    println(ans.toString())
}

fun com(a:Int, b:Int, prevZero: Boolean):Int {
    var mul = -1
    if(prevZero) {
        mul = 1
    }
    if(a % 2 == 1) {
        if(b % 2 == 1) {
            return a.compareTo(b) * mul
        } else {
           return -1 * mul
        }
    } else {
        if(b % 2 == 0) {
            return b.compareTo(a) * mul
        } else {
            return 1 * mul
        }
    }
}

val map = mutableMapOf<Int, Array<Int>>()
fun getList(num:Int):Array<Int>? {
    if(num == 1) {
        return arrayOf(1)
    }
    if(num == 0) {
        return arrayOf()
    }
    map[num]?.let { return it }
    val lastIndex = sqrt(num.toDouble()).toInt()
    val list = mutableListOf<Array<Int>>()
    var len = num
    var minList = Array<Int>(0, {0})
    (1..lastIndex).reversed().forEach {
        val ret = getList(num - it * it)
        val idx = it
        ret?.let {
            if(it.size < len) {
                val list = mutableListOf(idx)
                list.addAll(it)
                len = it.size
                minList = list.toTypedArray()
            }
        }
    }
    if(minList.isEmpty()) {
        return null
    }
    map[num] = minList
    return minList
}

fun getWord(prevZero:Boolean, num:Int):String {
    if(prevZero) {
        return (1..num).map { (it - 1) % 2 }.joinToString("")
    } else {
        return (1..num).map { it % 2 }.joinToString("")
    }
}
0