P4995题解:跳跳!
wuling_myz · · 题解
这是我的第一篇题解,也许这也是洛谷上第一篇小学生写的算法题解。
首先,运用一下xxs的知识,可以找到一个规律:从地面跳到第一块石头,再从第一跳到第n块,再跳到第二块,再跳到第(n-1)块······(当然是排序过的石头高度)别问为什么,问就是小学生的直觉
首先从地面跳到石头上所耗费的体力值是最大的,所以让他第一次跳到最高的石头上肥肠的合理。此时让他从最高的石头跳到最低的石头,耗费的体力值也很大。再让他跳到次高的石头······
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
long long a,b[310],max=0,cnt=1; //十年OI一场空,不开long long见祖宗
scanf("%lld",&a);
for(long long i=1;i<=a;i++)
{
scanf("%lld",&b[i]);
} //输入
sort(b+1,b+a+1); //sort排序
b[0]=0;
long long e=0,h=a; //左指针、右指针
while(e<h)
{
if(cnt%2==1) //运用cnt模2的值来判定左右指针何时移动
{
max+=(b[h]-b[e])*(b[h]-b[e]); //max存体力值
e++;
cnt++;
}
else
{
max+=(b[h]-b[e])*(b[h]-b[e]);
h--;
cnt++;
}
}
printf("%lld",max); //输出
return 0;
}
//第六行数据补充说明:a代表石头个数,b[310]代表石头高度,cnt、max见注释
审核给过吧,让这个世界上多一篇题解(不给过给你一个附了绑定诅咒的海龟壳)