题解 | #仓鼠快速签到#
仓鼠快速签到
https://ac.nowcoder.com/acm/contest/31620/A
发点迷惑代码 dfs 加打表辅助
import kotlin.math.abs
import kotlin.math.max
fun main(args: Array<String>) {
val s = IntArray(10) { 0 }
dfs(s)
}
val out = listOf("-", "A", "B", "C")
fun dfs(s: IntArray, t: Int = 0) {
if (t >= 10) {
if (judge(s)) {
for (i in s) {
print(out[i])
}
println()
}
return
}
(1..3).forEach {
s[t] = it
dfs(s, t + 1)
}
}
val prime = setOf(2, 3, 5, 7)
val q3 = listOf(0, 3, 2, 1)
val q4 = listOf(0, 2, 1, 0)
val q7 = listOf(0, 2, 3, 4)
fun judge(s: IntArray): Boolean {
val aCount = s.count { it == 1 }
val bCount = s.count { it == 2 }
val cCount = s.count { it == 3 }
// 选择 A 的题数, 选择 B 的题数, 选择 C 的题数, 这三个数中质数有多少个?
val primeCount = listOf(aCount, bCount, cCount).count { it in prime }
if (s[0] != primeCount) {
return false
}
// 选择 B 的题数有多少?
if (s[1] != bCount - 1) {
return false
}
// 选择 A 的题数与选择 C 的题数之差的绝对值是多少?
val diffAC = abs(aCount - cCount)
if (q3[s[2]] != diffAC) {
return false
}
// 本题与上一题答案的 ASCII 码之差的绝对值是多少?
val diffQ3Q4 = abs(q3[s[2]] - q3[s[3]])
if (q4[s[3]] != diffQ3Q4) {
return false
}
// 哪两道题的答案相同?
val q5c = listOf(s[1] == s[2], s[3] == s[4], s[5] == s[6])
if (q5c.count { it } != 1) {
return false
}
val q5t = q5c.indexOf(true)
if (q5t != s[4] - 1) {
return false
}
// 有多少其他题的答案与本题相同?
val q6c = listOf(aCount, bCount, cCount)
if (s[5] + 1 != q6c[s[5] - 1]) {
return false
}
// 最长有多少连续的题答案相同?
val q7c = run {
var ret = 1
var last = -1
var nowCount = -1
for (i in s) {
if (i == last) {
nowCount++
} else {
if (nowCount > ret) {
ret = nowCount
}
nowCount = 1
}
last = i
}
max(ret, nowCount)
}
if (q7c != q7[s[6]]) {
return false
}
return true
}