CF1706C
先考虑当 $n$ 为奇数的时候,
则 $2, 4, \dots, n - 1$ 为最大限度,所以让这些楼层比两边高即可。
那么 $n$ 是偶数呢?$2, 4, \dots , n - 2$ 为最大限度,
然而最大限度的楼层不止一个!
比方说 $n = 6$,有
$$1 2 1 2 1 1$$
$$1 2 1 1 2 1$$
$$1 1 2 1 2 1$$
其中,$1$ 表示矮楼层,$2$ 表示高楼层。
可以发现,每两个方案中都是有关系的,
即比如
$$1 2 1 2 1 1$$
与
$$1 2 1 1 2 1$$
其中一个高楼层是从位置 $4$ 移动到 位置 $5$,
也就是说,在计算过程中,可以先算出
$$1 2 1 2 1 1$$
所需要的代价,然后减去位置 $4$ 所需的代价,加上位置 $5$ 所需的代价,即可得到
$$121121$$
同理,最后一个也是可以得到的。
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main() {
int T; scanf ("%d", &T);
while (T --) {
int n; scanf ("%d", &n);
for (int i = 1; i <= n; ++i) scanf ("%d", &a[i]);
long long ans = 0, sum = 0;
for (int i = 2; i < n; i += 2) {
sum = (sum + max (0, max (a[i - 1], a[i + 1]) + 1 - a[i]));
}
ans = sum;
if (!(n & 1)) {
for (int i = n - 2; i >= 2; i -= 2) {
sum -= max (0, max (a[i - 1], a[i + 1]) + 1 - a[i]);
sum += max (0, max (a[i], a[i + 2]) + 1 - a[i + 1]);
ans = min (ans, sum);
}
}
printf ("%lld\n", ans);
}
return 0;
}
没开 long long 见祖宗,十年打水一场空。