complete 9655.kt 25331.kt 32189.kt
This commit is contained in:
166
storage/zeta/kt/completed/25331.kt
Normal file
166
storage/zeta/kt/completed/25331.kt
Normal file
@@ -0,0 +1,166 @@
|
||||
import java.io.StreamTokenizer
|
||||
import kotlin.math.min
|
||||
|
||||
const val SIDE = 7
|
||||
const val SIZE = SIDE * SIDE
|
||||
|
||||
class Drop7Simulator(val initState: IntArray) {
|
||||
var state: IntArray = initState.clone()
|
||||
|
||||
fun init() {
|
||||
state = initState.clone()
|
||||
}
|
||||
|
||||
fun getPos(row: Int, col: Int): Int = row * SIDE + col
|
||||
fun getRC(pos: Int) = Pair(pos / SIDE, pos % SIDE)
|
||||
|
||||
fun getAt(pos: Int) = state[pos]
|
||||
fun getAt(row: Int, col: Int): Int = state[row * SIDE + col]
|
||||
fun setAt(row: Int, col: Int, value: Int) {
|
||||
state[row * SIDE + col] = value
|
||||
}
|
||||
|
||||
fun swapAt(r1: Int, c1: Int, r2: Int, c2: Int) {
|
||||
val v1 = getAt(r1, c1)
|
||||
setAt(r1, c1, getAt(r2, c2))
|
||||
setAt(r2, c2, v1)
|
||||
}
|
||||
|
||||
fun countBalls(): Int {
|
||||
return state.count {
|
||||
it != 0
|
||||
}
|
||||
}
|
||||
|
||||
fun print() {
|
||||
for (i in 0 until SIDE) {
|
||||
for (j in 0 until SIDE) {
|
||||
print(getAt(i, j))
|
||||
print(" ")
|
||||
}
|
||||
println()
|
||||
}
|
||||
}
|
||||
|
||||
fun start(ball: Int): Int {
|
||||
var minimum = Integer.MAX_VALUE
|
||||
for (j in 0 until SIDE) {
|
||||
if (getAt(0, j) != 0) {
|
||||
continue
|
||||
}
|
||||
init()
|
||||
var falling = SIDE - 1
|
||||
for (i in 1 until SIDE) {
|
||||
if (getAt(i, j) != 0) {
|
||||
falling = i - 1
|
||||
break
|
||||
}
|
||||
}
|
||||
setAt(falling, j, ball)
|
||||
|
||||
while (update());
|
||||
minimum = min(minimum, countBalls())
|
||||
}
|
||||
|
||||
return minimum
|
||||
}
|
||||
|
||||
fun update(): Boolean {
|
||||
// 삭제 작업
|
||||
val candidate = mutableListOf<Int>() // List<Pos>
|
||||
val groups = mutableListOf<Pair<Int, Int>>() //
|
||||
for (i in 0 until SIDE) {
|
||||
for (j in 0 until SIDE) {
|
||||
val pos = getPos(i, j)
|
||||
val ele = getAt(pos)
|
||||
|
||||
if (ele == 0) {
|
||||
groups.filter {
|
||||
it.first == groups.size
|
||||
}.forEach {
|
||||
candidate.add(it.second)
|
||||
}
|
||||
|
||||
groups.clear()
|
||||
} else {
|
||||
groups.add(Pair(ele, pos))
|
||||
}
|
||||
}
|
||||
groups.filter {
|
||||
it.first == groups.size
|
||||
}.forEach {
|
||||
candidate.add(it.second)
|
||||
}
|
||||
groups.clear()
|
||||
|
||||
}
|
||||
|
||||
for (j in 0 until SIDE) {
|
||||
for (i in 0 until SIDE) {
|
||||
val pos = getPos(i, j)
|
||||
val ele = getAt(pos)
|
||||
|
||||
if (ele == 0) {
|
||||
groups.filter {
|
||||
it.first == groups.size
|
||||
}.forEach {
|
||||
candidate.add(it.second)
|
||||
}
|
||||
|
||||
groups.clear()
|
||||
} else {
|
||||
groups.add(Pair(ele, pos))
|
||||
}
|
||||
}
|
||||
|
||||
groups.filter {
|
||||
it.first == groups.size
|
||||
}.forEach {
|
||||
candidate.add(it.second)
|
||||
}
|
||||
groups.clear()
|
||||
}
|
||||
|
||||
|
||||
if (candidate.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
|
||||
candidate.forEach {
|
||||
state[it] = 0
|
||||
}
|
||||
|
||||
// 중력 업데이트
|
||||
|
||||
for (j in 0 until SIDE) {
|
||||
for (i in (0 until SIDE - 1).reversed()) {
|
||||
var now = i
|
||||
if (getAt(now, j) == 0) {
|
||||
continue
|
||||
}
|
||||
while (now < SIDE - 1 && getAt(now + 1, j) == 0) {
|
||||
swapAt(now, j, now + 1, j)
|
||||
now++
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun main() = with(StreamTokenizer(System.`in`.bufferedReader())) {
|
||||
val state = IntArray(SIZE)
|
||||
|
||||
for (i in 0 until SIZE) {
|
||||
nextToken()
|
||||
state[i] = nval.toInt()
|
||||
}
|
||||
|
||||
val simulator = Drop7Simulator(state)
|
||||
|
||||
nextToken()
|
||||
val ball = nval.toInt()
|
||||
|
||||
println(simulator.start(ball))
|
||||
}
|
||||
61
storage/zeta/kt/completed/32189.kt
Normal file
61
storage/zeta/kt/completed/32189.kt
Normal file
@@ -0,0 +1,61 @@
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
||||
fun maxSplitDiscordance(s: String): Int {
|
||||
val n = s.length
|
||||
val dp = IntArray((n + 1) * (n + 1))
|
||||
|
||||
fun getLCS(i: Int, j: Int): Int { // where i and j means string index
|
||||
return dp[(i + 1) * (n + 1) + (j + 1)]
|
||||
}
|
||||
|
||||
fun setLCS(i: Int, j: Int, v: Int): Int {
|
||||
dp[(i + 1) * (n + 1) + (j + 1)] = v
|
||||
return v
|
||||
}
|
||||
|
||||
var maxDiscordance = 0
|
||||
var lcs: Int
|
||||
val candidate = if (n % 2 == 0) {
|
||||
listOf(n / 2)
|
||||
} else {
|
||||
listOf(n / 2, n / 2 + 1)
|
||||
}
|
||||
for (splitLoc in candidate) {
|
||||
lcs = 0
|
||||
for (x in 0 until splitLoc) {
|
||||
setLCS(x, splitLoc - 1, 0)
|
||||
}
|
||||
|
||||
|
||||
for (i in 0 until splitLoc) {
|
||||
for (j in splitLoc until n) {
|
||||
|
||||
if (s[i] == s[j]) {
|
||||
lcs = max(setLCS(i, j, getLCS(i - 1, j - 1) + 1), lcs)
|
||||
} else {
|
||||
lcs = max(
|
||||
setLCS(
|
||||
i, j, max(
|
||||
getLCS(i, j - 1),
|
||||
getLCS(i - 1, j)
|
||||
)
|
||||
),
|
||||
lcs
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
maxDiscordance = max(maxDiscordance, min(splitLoc, n - splitLoc) - lcs)
|
||||
}
|
||||
|
||||
return maxDiscordance
|
||||
|
||||
}
|
||||
|
||||
fun main() {
|
||||
val s = readln()
|
||||
|
||||
println(maxSplitDiscordance(s))
|
||||
}
|
||||
17
storage/zeta/kt/completed/9655.kt
Normal file
17
storage/zeta/kt/completed/9655.kt
Normal file
@@ -0,0 +1,17 @@
|
||||
fun canWin(n: Int): Boolean {
|
||||
return n % 2 != 0
|
||||
}
|
||||
|
||||
fun main() = with(System.`in`.bufferedReader()) {
|
||||
val n = this.readLine().toInt()
|
||||
|
||||
System.out.bufferedWriter().use {
|
||||
it.write(
|
||||
if (canWin(n)) {
|
||||
"SK"
|
||||
} else {
|
||||
"CY"
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user