[R3D] 三角形
- 难度 普及/提高-
- 时限 1s
- 空限 512m
- 双指针排序
数据规模:,。
思路
木棍排序后,对每对较短的木棍 ,若最长边取 (),构成三角形的条件是 。
固定 时,随着 增大,满足条件的最大 也单调不减,因此用 双指针:对每个 ,让 随 单调右移,每对 的合法 的数量为 ,累加即可。
复杂度:时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
import std.sort.*
main(): Int64 {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
sort(a)
var ans: Int64 = 0
for (i in 0..n) {
var k = i + 2
for (j in (i + 1)..(n - 1)) {
if (k <= j) {
k = j + 1
}
while (k < n && a[i] + a[j] > a[k]) {
k += 1
}
ans += k - j - 1
}
}
println(ans)
return 0
}
要点:
- 答案最大为 ,用
Int64保存。 - 双指针中 随 单调不减,注意每轮 重置 。