ABC190 C - Bowls and Dishesのメモ
目についたC問題を解いてみるの回です。
考察
入力値にグラフっぽさがありますが、実際にはグラフの走査のようなことはせずにbit全探索で解けます。
全員が
全パターンだと
(
全員がボールを置いた状態を記録したら、
実装
import kotlin.math.max
fun main() {
val (n, m) = readLine()!!.split(" ").map { it.toInt() }
val ab = List(m) {
val (a, b) = readLine()!!.split(" ").map { it.toInt() }
a to b
}
val k = readLine()!!.toInt()
val cd = List(k) {
val (c, d) = readLine()!!.split(" ").map { it.toInt() }
c to d
}
var ans = 0
for(mask in 0 until (1 shl k)) {
val bucket = IntArray(n+1)
for(i in 0 until k) {
val (c, d) = cd[i]
if(mask and (1 shl i) == 0) {
bucket[c]++
} else {
bucket[d]++
}
}
var cnt = 0
for(i in 0 until m) {
val (a, b) = ab[i]
if(bucket[a] != 0 && bucket[b] != 0) {
cnt++
}
}
ans = max(ans, cnt)
}
println(ans)
}
上に書いた通り、ビットが0だったらmask
は0から始めないといけません。
ボールが置かれた皿の状態をbucket
という配列で管理しています。n+1
を確保しています。初期値はデフォルトで0です。何も置かれていない状態は0で表せるのでそのままでOKです。
ボールが置かれた状態は各パターンで独立なのでbucket
はループ内で宣言しています。
全てのボールが置かれた後の状態を記録したら、
Discussion