[R65B] 卡片
- 难度 普及-
- 时限 1s
- 空限 512m
- 枚举
数据规模:,。
思路
从每个起点 出发,检查连续 张卡片(环形取模)是否为 的一个排列:用标记数组记录 中各数是否出现过,一旦遇到越界值( 或 )或重复值就失败。按 从小到大找,第一个成功的就是答案。
复杂度:时间 ,空间 。, 次检查完全可行。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let nk = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
let n = nk[0]
let k = nk[1]
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
var ans: Int64 = -1
for (s in 0..n) {
var seen = Array<Bool>(k + 1, { _ => false })
var ok = true
for (t in 0..k) {
let v = a[(s + t) % n]
if (v < 1 || v > k || seen[v]) {
ok = false
break
}
seen[v] = true
}
if (ok) {
ans = s + 1
break
}
}
println(ans)
return 0
}
要点:
- 环形取卡片用
(s + t) % n处理,第 张的下一张自然回到第 1 张。 - 检查到 个互不相同且都在 内的数,就必然是 的一个排列。
- 找到第一个合法起点即
break,天然满足「输出最小的 」。