luoguP4995 跳跳

此题比较简单,排序,然后扫一遍,每次选高度差最大的跳即可

可是我不会找最大高度差怎么办

易证明从最低的(就是地面)跳到最高的一定比其它的高度差要大,其次最高的跳到第二低的一定只比从最低的跳到最高的高度差小,比其他的要大,所以我们得到了贪心策略。

下面贴代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define maxn 301
using namespace std;
long long n,a[301],ans,sum,num,l=0;//不要忘记开long long,不然会爆,我比赛时就因此少得了50分(蓝瘦香菇)。l要从零开始,因为要从地面跳上去。
int main() {
    scanf("%lld",&n);
    for(int i=1; i<=n; i++)
        scanf("%lld",&a[i]);
    sort(a+1,a+n+1);//也可以从大到小排,不过我懒得打重载了。
    while(num<n)//最后要留在一块石头上,跳的次数比石头数少1;
    {
        if(l<=n/2) sum+=(a[l]-a[n-l])*(a[l]-a[n-l]),l=n-l;//从左半边跳到右半边
        else  sum+=(a[l]-a[n-l+1])*(a[l]-a[n-l+1]),l=n-l+1;//从右半边跳到左半边,别忘了加一,要跳到下一块(从前一块跳走的)
        num++;
    }
    printf("%lld",sum);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43795131/article/details/84893456
今日推荐