結果
| 問題 | No.5017 Tool-assisted Shooting |
| コンテスト | |
| ユーザー |
エセ賢者
|
| 提出日時 | 2023-08-03 14:55:13 |
| 言語 | Kotlin (2.1.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 4,565 bytes |
| コンパイル時間 | 18,516 ms |
| コンパイル使用メモリ | 441,420 KB |
| 実行使用メモリ | 71,876 KB |
| スコア | 74,830 |
| 平均クエリ数 | 1.00 |
| 最終ジャッジ日時 | 2023-08-03 14:56:13 |
| 合計ジャッジ時間 | 56,860 ms |
|
ジャッジサーバーID (参考情報) |
judge11 / judge12 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 100 |
コンパイルメッセージ
Main.kt:10:10: warning: parameter 'args' is never used
fun main(args: Array<String>) {
^
Main.kt:84:103: warning: elvis operator (?:) always returns the left operand of non-nullable type Enemy
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y } ?: return
^
Main.kt:95:103: warning: elvis operator (?:) always returns the left operand of non-nullable type Enemy
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y } ?: return
^
Main.kt:106:103: warning: elvis operator (?:) always returns the left operand of non-nullable type Enemy
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y } ?: return
^
Main.kt:127:13: warning: condition 'first != null' is always 'true'
if (first != null && first.h > (first.y - own.y) * own.level()) {
^
Main.kt:130:50: warning: 'sumBy((T) -> Int): Int' is deprecated. Use sumOf instead.
return enemyList.filter { it.isAlive() }.sumBy { it.h }
^
ソースコード
private fun next() = readLine()!!
private fun nextInt() = next().toInt()
private fun nextLong() = next().toLong()
private fun nextDouble() = next().toDouble()
private fun nextList() = next().split(" ")
private fun nextIntList() = next().split(" ").map { it.toInt() }.toIntArray()
private fun nextLongList() = next().split(" ").map { it.toLong() }.toLongArray()
private fun nextDoubleList() = next().split(" ").map { it.toDouble() }.toDoubleArray()
fun main(args: Array<String>) {
var gameState = GameState()
while (!gameState.isDone()) {
val n = nextInt()
if (n == -1) {
return
}
for (i in 0 until n) {
val hpx = nextIntList()
gameState.addEnemy(hpx)
}
val validMove = gameState.validMove()
val nextSteps = mutableListOf<Pair<String, GameState>>()
for (move in validMove) {
when (move) {
"S" -> {
val state = gameState.copy()
state.nextTurnS()
nextSteps.add(Pair("S", state))
}
"R" -> {
val state = gameState.copy()
state.nextTurnR()
nextSteps.add(Pair("R", state))
}
"L" -> {
val state = gameState.copy()
state.nextTurnL()
nextSteps.add(Pair("L", state))
}
}
}
val minState =
nextSteps.sortedWith(
compareBy(
{ pair -> pair.second.enemyList.count { it.isAlive() } },
{ it.second.evaluateScore() })
).first()
gameState = minState.second
println(minState.first)
}
}
class GameState {
var enemyList = mutableListOf<Enemy>()
var own = Own(12, 0)
var turn = 0
fun addEnemy(hpx: IntArray) {
enemyList.add(Enemy(hpx[2], 59 + turn, hpx[0], hpx[1]))
}
fun isDone(): Boolean {
return turn >= 1000
}
fun validMove(): Array<String> {
val move = mutableListOf("S")
if (enemyList.none { it.x == own.x + 1 && it.y == own.y }) {
move.add("R")
}
if (enemyList.none { it.x == own.x - 1 && it.y == own.y }) {
move.add("L")
}
return move.toTypedArray()
}
fun nextTurnS() {
turn++
own.up()
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y } ?: return
first.hit(own.level())
if (!first.isAlive()) {
own.defeat(first.p)
}
}
fun nextTurnR() {
turn++
own.up()
own.right()
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y } ?: return
first.hit(own.level())
if (!first.isAlive()) {
own.defeat(first.p)
}
}
fun nextTurnL() {
turn++
own.up()
own.left()
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y } ?: return
first.hit(own.level())
if (!first.isAlive()) {
own.defeat(first.p)
}
}
fun copy(): GameState {
val gameState = GameState()
gameState.enemyList = enemyList.map { Enemy(it.x, it.y, it.h, it.p) }.toMutableList()
gameState.own = own.copy()
gameState.turn = turn
return gameState
}
fun evaluateScore(): Int {
val collision = enemyList.filter { it.x == own.x && (it.y == own.y || it.y == own.y + 1) }
val first = enemyList.filter { it.isAlive() && it.x == own.x && it.y > own.y }.minBy { it.y }
if (collision.isNotEmpty()) {
return Int.MAX_VALUE
}
if (first != null && first.h > (first.y - own.y) * own.level()) {
return Int.MAX_VALUE
}
return enemyList.filter { it.isAlive() }.sumBy { it.h }
}
}
class Enemy(var x: Int, var y: Int, var h: Int, var p: Int) {
fun isAlive(): Boolean {
return h > 0
}
fun hit(damage: Int) {
h -= damage
}
}
class Own(var x: Int, var y: Int) {
var p = 100
fun defeat(power: Int) {
p += power
}
fun level(): Int {
return p / 100
}
fun up() {
y++
}
fun right() {
x++
}
fun left() {
x--
}
fun copy(): Own {
val copy = Own(x, y)
copy.p = p
return copy
}
}
エセ賢者