C. Qpwoeirut And The City

https://codeforces.com/problemset/problem/1706/C

题意:给定n个building,每个building有一个高度,而且某个building前面和后面有building,并且前后的builing高度小于它,则它是cool的。现在可以对building高度进行增加,让cool building最多的情况下,最少需要增加多少的高度。

思路:如果n是奇数,那么只有一种解决方案,一次遍历即可。如果n是偶数,那么至少有一对[i, i + 1]都不是cool building。先求出一种解决方案,然后用这种解决方案去进行递推,取代价最小的结果即可。

总结:奇数情况好想,也知道数量应该是(n - 1) / 2,但是偶数的所有可能没有列举出来,如果列举出偶数排列的所有cool可能性,然后观察所有可能性之间的联系,进行递推就行了。思路就是,删除上一次结果的某个代价,然后将代价换位另一个新的代价。。

inline void solve() {
    int n;
    cin >> n;

    vector<int> a(n);
    for (auto& x : a) {
        cin >> x;
    }

    long long ans = 0;
    if (n & 1) {
        for (int i = 1; i < n - 1; i += 2) {
            int l = std::max(0, a[i - 1] - a[i] + 1);
            int r = std::max(0, a[i + 1] - a[i] + 1);
            ans += max(l, r);
        }
    }
    else {
        auto get = [&](int x) {
            return std::max(std::max(a[x - 1], a[x + 1]) - a[x] + 1, 0);
        };
        long long res = 0;
        for (int i = 1; i < n - 1; i += 2) {
            res += get(i);
        }
        ans = res;
        for (int i = n - 2; i - 2 >= 0; i -= 2) {
            res -= get(i - 1);
            res += get(i);
            ans = min(ans, res);
        }
    }

    cout << ans << '\n';
}
posted @ 2025-07-17 09:45  _Yxc  阅读(6)  评论(0)    收藏  举报