思路参考 JASON杨 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
贪心算法
对输入的数组从小到大排序
每次从未跳过的最小跳到最大,再从最大跳到最小 ;
跳跃过程代码
for (int i=1;i<=n;i++)
{
j=n-j+sum; //下标计算
sum=!sum; //取反 sum的值只能为0和1 用来充当5->1->4过程中的1
ans+=(h[j]-hpast)*(h[j]-hpast);
hpast=h[j];//记录上一次跳跃的高度
}
完整代码
#include<bits/stdc++.h>
using namespace std;
long long ans=0;
int h[330];
bool sum=0;
signed main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>h[i];
}
sort(h+1,h+n+1);
int j=0,hpast=0;
for (int i=1;i<=n;i++)
{
j=n-j+sum;
sum=!sum;
ans+=(h[j]-hpast)*(h[j]-hpast);
hpast=h[j];
}
cout<<ans;
return 0;
}
是否需要考虑奇偶?
不用 ,1-》n一共跳了n次
输入了n个数 ,0-》n -> 1 -> n-1 -> 2 -> ....
因为包含0 刚好n+1个数 正好跳n次