题解 | #仓鼠快速签到#

仓鼠快速签到

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
}
全部评论

相关推荐

内向的柠檬精在研究求职打法:你们广东工业大学为啥这么多字节,好吓人,还有那个东北大学,重庆邮电,太哈人了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务