[R17A]谁在装弱
- 难度 入门
- 时限 1s
- 空限 512m
- 模拟
数据规模:,,满分为 ,且 序列非递增。
思路
按题意,恰好一个同学装弱:把第 名的真实分数 ,其余位置 。装弱的人选 合法,当且仅当替换后真实分数序列 仍满足非递增,且每个 (满分约束)。
由于原 序列已是非递增的,把第 位从 改成 (变大)只会破坏第 位附近的相邻关系,远处不受影响。因此逐个枚举 ,只需检查三个条件:
- 满分约束:。例如样例 1 的第 1 名 ,真实分数 超过满分,不合法。
- 与左边的关系():。否则第 名真实分数超过第 名,破坏降序。样例 1 的第 2 名 即不合法。
- 与右边的关系():。否则第 名反而更高,破坏降序。样例 1 的第 5 名 不合法。
三个条件都满足的 即可能是装弱者,统计个数即可。
复杂度
时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let b = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let FULL: Int64 = 1000000
var ans: Int64 = 0
for (i in 0..n) {
let real = b[i] + 10
if (real > FULL) {
continue
}
// 检查替换后序列保持非递增 b[i-1] >= b[i](real 放在位置 i)
var ok = true
if (i > 0) {
if (b[i - 1] < real) {
ok = false
}
}
if (ok && i < n - 1) {
if (real < b[i + 1]) {
ok = false
}
}
if (ok) {
ans += 1
}
}
println(ans.toString())
return 0
}