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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值