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 见祖宗,十年打水一场空。

posted @ 2022-07-20 10:45  wangzhongyuan  阅读(1)  评论(0编辑  收藏  举报  来源