1. 程式人生 > >洛谷P4995 跳跳!題解

洛谷P4995 跳跳!題解

求關注,求贊,求評論QAQ

簡單描述一下吧,就是說有n塊石頭,起始可以跳到任何一塊上面,接著也是,只不過每一塊石頭只能跳一次,求耗費的最大的體力(計算方法見連結)

分析:

這道題一看,我們要最大化我們的體力值,說明我們的每一次要儘可能的跳的遠,此時我們就可以採用貪心的思想,把每一次的跳躍體力值最大化,那麼就能得到體力值總和的最大化。

先把序列從小到大排序,因為我們知道,每次要跳的儘可能遠,所以說我們可以第一步先跳到排序後第n個石頭,第二步跳到第1個石頭。

不難發現,這樣的話就是正解。

程式碼:

#include<bits/stdc++.h>
using namespace std;
long long m,n,a[1000],ans;
int main()
{
    scanf("%d",&m);
    for(int i=1;i<=m;i++) scanf("%lld",a[i]);
    sort(a+1,a+m+1);//從小到大排序
    int head=1,now=0,flag=0,tail=m;//head記錄的是從頭開始,tail記錄從n開始,flag記錄這一步該頭還是該尾
    while(head<=tail)//當兩個還沒有重合之時
    {
        if(!flag) 
        {
            ans+=(now-a[tail])*(now-a[tail]);
            now=a[tail];
            tail--;
            flag=1;
        }
        else 
        {
            ans+=(now-a[head])*(now-a[head]);
            now=a[head];
            head++;
            flag=0;
        }
        //分兩種情況,每次別忘了記錄下當前在哪
    }
    printf("%lld\n",ans);
}

求關注,求贊,求評論QAQ