题解:CF2011D Among Wolves
假设羊在 \((x,y)\),羊左边有 \(a\) 只狼,右边就有 \(c\) 只狼,考虑下面三种方法:
- 在 \((x,y)\) 周围的三个点放壕沟,费用为 \(3\cdot b\)。
- 在 \((x+1,1),(x+1,2)\) 放壕沟,把左边的 \(a\) 只狼干掉,费用为 \(h\cdot a + 2\cdot b\)。
- 在 \((x-1,1),(x-1,2)\) 放壕沟,把左边的 \(a\) 只狼干掉,费用为 \(h\cdot c + 2\cdot b\)。
- 干掉所有狼,费用 \((a+c)\cdot h\)。
- 如果 \(x=1\) 或 \(x=n\),费用为 \(\min(2\cdot b,(a+c)\cdot h)\)。
答案取最小值即可。
代码:
import kotlin.math.min
fun main() {
val t = readln().toInt()
for (test in 1..t) {
val (n, h, b) = readln().split(" ").map { it.toLong() }
val s = arrayOf(readln(), readln())
val f0 = s[0].indexOf('S')
val f1 = s[1].indexOf('S')
val Sx = if (f0 == -1) f1 else f0
var wR = 0L
var wL = 0L
for (i in Sx + 1..n - 1) {
if (s[0][i.toInt()] == 'W') wR += 1
if (s[1][i.toInt()] == 'W') wR += 1
}
for (i in 0..Sx - 1) {
if (s[0][i.toInt()] == 'W') wL += 1
if (s[1][i.toInt()] == 'W') wL += 1
}
var ans: Long
if (Sx != 0 && Sx.toLong() != n - 1) {
ans = min(b * 3, b * 2 + wR * h)
ans = min(ans, b * 2 + wL * h)
ans = min(ans, (wL + wR) * h)
} else
ans = min(b * 2, (wL + wR) * h)
println(ans)
}
}

浙公网安备 33010602011771号