[R64B] 方形靶

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1n1001 \le n \le 1000ai,j1090 \le a_{i,j} \le 10^9

思路

按行读入 n×nn \times n 的得分矩阵,再读入 nnX / . 字符。扫描字符矩阵,凡是 X 的位置就把对应得分累加到答案。

复杂度:时间 O(n2)O(n^2),空间 O(n2)O(n^2)

仓颉实现

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

main(): Int64 {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    var a = Array<Int64>(n * n, { _ => 0 })
    for (i in 0..n) {
        let row = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
        for (j in 0..n) {
            a[i * n + j] = row[j]
        }
    }
    var ans: Int64 = 0
    for (i in 0..n) {
        let s = reader.readln().getOrThrow()
        for (j in 0..n) {
            if (s[j] == UInt8(0x58)) {
                ans = ans + a[i * n + j]
            }
        }
    }
    println(ans)
    return 0
}

要点:

  • 得分矩阵展平成一维数组,下标 i * n + j 对应第 ii 行第 jj 列。
  • X 的 ASCII 码是 0x58,字符矩阵逐字节判断即可。
  • 单格得分可达 10910^9,总得分约 101310^{13},用 Int64 累加。