题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328

题意:

  给你一个长度为n的正整数序列。

  可以选任意个数字,只能从左往右选。

  偶数步答案加上这个数,奇数步减去这个数。

  问你最大答案。

题解:

  对于一个递减区间,只能加上最高,减去最低,在中间部分不可能有操作(会使答案减小)。

  例如:

  BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】-LMLPHP

  [0,4]段单调递减。

  如果加上a[0],减去a[4],则在[0,4]这段区间内不可能再有任何有用的选择。

  所以贪心策略:

    找出每一个递减区间,加波峰,减波谷。

    另外对于最后一个区间,不用减波谷。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 150005 using namespace std; int n;
int ans=;
int cnt=;
int a[MAX_N]; int main()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>a[i];
}
a[n]=;
for(int i=;i<n;i++)
{
if(!(cnt&) && a[i]>a[i+])
{
ans+=a[i];
cnt++;
}
if((cnt&) && a[i]<a[i+])
{
ans-=a[i];
cnt++;
}
}
cout<<ans<<endl;
}
05-11 19:32