题解: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)
	}
}
posted @ 2024-10-04 21:26  cly312  阅读(3)  评论(0)    收藏  举报