P4995题解:跳跳!

· · 题解

这是我的第一篇题解,也许这也是洛谷上第一篇小学生写的算法题解。

首先,运用一下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见注释

审核给过吧,让这个世界上多一篇题解(不给过给你一个附了绑定诅咒的海龟壳