题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328
题意:
给你一个长度为n的正整数序列。
可以选任意个数字,只能从左往右选。
偶数步答案加上这个数,奇数步减去这个数。
问你最大答案。
题解:
对于一个递减区间,只能加上最高,减去最低,在中间部分不可能有操作(会使答案减小)。
例如:
[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;
}