这是一道很简单的贪心+排序,为什么我第一次还是wa了一半呢,我是没有料到他的数据给的很大,导致我第一次只开了int,第二次换了long long就过了,这题总体思路就是大小跳,先从大到小排序好因为要找他最多能跳多少的能力,所以一开始肯定是从0跳到最高的地方,这个我们预处理好,然后就是用两个指针指向数组中最大和最小的地方,然后用给flag切换每次大小跳就行了石头调完了小青蛙就可以休息了;注意开Long long;
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
long long a[350];
bool cmp(long long x,long long y){ //排个序
return x>y;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1,cmp);
long long tail=n,sum=0,top=1,temp=0,flag=1;
sum+=a[1]*a[1]; //预处理第一次跳
for(int i=2;i<=n;i++){
if(flag){
temp=(a[top]-a[tail])*(a[top]-a[tail]); //大小跳,每次移动指针
sum+=temp; //加上两块石头的差值的平方
flag=0; //大小切换
top++; //指针移动
}else{
temp=(a[top]-a[tail])*(a[top]-a[tail]); //同上
sum+=temp;
flag=1;
tail--;
}
}
cout<<sum;
return 0;
}