[R72C] 协调
数据规模:,,,且单个测试点内所有测试数据的 之和不超过 。
思路
假设调整后所有元素都等于 。对于每个奇数下标 有
所有奇数位置加上的数相同,因此它们在调整前就必须全部相等,记这个公共值为 。同理,所有偶数位置在调整前也必须全部相等,记公共值为 。
当奇数位置、偶数位置都存在时,还需要奇数位置上加 的结果等于偶数位置上减 的结果:
即 。因为 是非负整数,所以合法解存在的条件为:
- 所有奇数下标的值相同;
- 所有偶数下标的值相同;
- ;
- 是偶数。
条件成立时唯一可能的答案是 ,既是唯一解,自然也是最小合法值。
当 时没有偶数位置,单个元素总是已经「全部相等」,最小答案为 。
实现时只需一遍扫描,用第一个奇数位置的值 和第一个偶数位置的值 作为基准,检查各自位置是否全部相等,再按上述条件判断即可。
复杂度
时间 ,空间 (仅存数组)。
仓颉实现
查看仓颉实现
import std.env.*
import std.convert.*
func solve(reader: ConsoleReader) {
let n = Int64.parse(reader.readln().getOrThrow())
if (n == 1) {
reader.readln()
println("0")
return
}
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let o = a[0]
let e = a[1]
var ok = true
let nn = n
for (i in 1..nn) {
if (i % 2 == 0) {
if (a[i] != o) {
ok = false
}
} else {
if (a[i] != e) {
ok = false
}
}
}
if (!ok || e < o || (e - o) % 2 != 0) {
println("-1")
return
}
println(((e - o) / 2).toString())
}
main() {
let reader = getStdIn()
let t = Int64.parse(reader.readln().getOrThrow())
for (_ in 0..t) {
solve(reader)
}
}