小跳蛙 解题思路

· · 学习·文化课

核心思路

贪心

先给 h 数组从小到大排个序。

贪心的思路就是排序后按照以下方式移动:

也就是说:

实现代码如下:

示例程序

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n;
long long h[maxn], ans;

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> h[i];
    sort(h+1, h+n+1);
    for (int i = 0, j = n, k = 0; i < j; k ^= 1) {
        ans += (h[i] - h[j]) * (h[i] - h[j]);
        k ? j-- : i++;
    }
    cout << ans << endl;
    return 0;
}

这里,我用:

无论我当前在左端点还是右端点,跳一次的代价都是 (h_i - h_j)^2

当时:

然后 k 每一异或 1,是为了让 k0 \leftrightarrow 1 之间切换