[R74C] 中继站迁移方案
数据规模:,,。
思路
坐标范围很小(),直接枚举所有可能的迁移方案并逐一判定即可。
一次迁移由下标 与目标坐标 共同确定:
- 只能取内部点,即 (代码中为 0-based 的 )。
- 端点不动,故要求 ,候选为 中的所有整数。
- 不能与移动前任何一个点的坐标相同(包含 自身)。用一个布尔数组标记所有出现过的坐标,即可 判断某个 是否合法。
对每个候选 ,构造移动后的坐标序列:把第 位换成 ,其余位置保持原坐标,然后排序并检查相邻两个坐标之差是否都不超过 。若全部满足,就计入答案。
枚举总量为「内部下标数」乘「候选坐标数」,不超过 ,每组判定为 ,足够轻松通过。
复杂度
时间 ,其中 为坐标跨度,候选坐标数不超过 ;空间 。
仓颉实现
查看仓颉实现
import std.env.*
import std.convert.*
import std.sort.*
main() {
let reader = getStdIn()
let first = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let n = first[0]
let k = first[1]
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let maxCoord = 2001
let present = Array<Bool>(maxCoord, { _ => false })
for (v in a) {
present[v] = true
}
var ans = 0
var i = 1
while (i < n - 1) {
var x = a[0] + 1
while (x < a[n - 1]) {
if (!present[x]) {
let b = Array<Int64>(n, { _ => 0 })
var idx = 0
var j = 0
while (j < n) {
if (j == i) {
b[idx] = x
} else {
b[idx] = a[j]
}
idx += 1
j += 1
}
sort(b)
var ok = true
var t = 1
while (t < n) {
if (b[t] - b[t - 1] > k) {
ok = false
break
}
t += 1
}
if (ok) {
ans += 1
}
}
x += 1
}
i += 1
}
println(ans)
}