题目大意
给定石头的高度 $h$,从第 $i$ 块石头跳到第 $j$ 块上耗费体力 $(h_i-h_j)^2$ ,求最耗体力的路径。
分析
容易猜到贪心结论,是不断的在剩余石头中最大最小的来回跳。
考虑证明结论,设 $h_i$ 是将要跳的序列,展开求和式
$$ S = \sum_{k=1}^{n-1}(h_k-h_{k+1})^2 = \sum_{k=1}^nh_k^2 - 2\sum_{k=1}^{n-1}h_kh_{k+1} $$
注意到平方和为一个定值,重点在后半式。记 $H_k = h_{k+1}$,有
$$ \sum_{k=1}^{n-1}h_kH_k $$
利用高中时学的排序不等式,有
$$ \text{反序和} \leqslant \text{乱序和} \leqslant \text{顺序和} $$
于是有反序最小。双指针维护即可。
ll nn[310];
int main() {
ll n = rr();
for (ll i = 1; i <= n; i++)
nn[i] = rr();
sort(nn + 1, nn + n + 1);
ll l = 0, r = n, sum = 0;
while (l < r) {
ll t1 = nn[l] - nn[r], t2 = nn[l + 1] - nn[r];
sum += t1 * t1 + t2 * t2;
l++, r--;
}
printf("%lld\n", sum);
return 0;
}