[R20A]题号查询

  • 难度 普及-
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1x1211 \le x \le 121,Round 20 有 77 题,其余 Round 均有 66 题。

思路

题库按比赛顺序、从 Round 1 到 Round 20 依次编号。Round 1 到 Round 19 每场 66 题,共 19×6=11419 \times 6 = 114 题,对应编号 11114114;Round 20 多出一题,编号 115115121121

因此分两种情况:

  • x114x \le 114:第 r=(x1)/6+1r = \lfloor (x-1) / 6 \rfloor + 1 场,第 p=(x1)mod6p = (x-1) \bmod 6 题(p[0,5]p \in [0,5],对应字母 A 到 F)。
  • x>114x > 114:直接是 Round 20 的第 x115x - 115 题(p[0,6]p \in [0,6],对应字母 A 到 G)。

题号字母用 ASCII 码 65657171(A 到 G)通过 String.fromUtf8 构造即可,输出 R{r}{字母}

复杂度

时间 O(1)O(1),空间 O(1)O(1)

仓颉实现

import std.env.*
import std.convert.*

main(): Int64 {
    let reader = getStdIn()
    let x = Int64.parse(reader.readln().getOrThrow())
    var r: Int64 = 0
    var idx: Int64 = 0
    if (x <= 114) {
        // Round 1..19, 每场 6 题
        r = (x - 1) / 6 + 1
        idx = (x - 1) % 6
    } else {
        // Round 20, 共 7 题 (115..121)
        r = 20
        idx = x - 115
    }
    let letters = Array<String>(7, { i => String.fromUtf8(Array<UInt8>(1, { _ => UInt8(65 + i) })) })
    println("R${r}${letters[idx]}")
    return 0
}