题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328
题意:
给你一个长度为n的正整数序列。
可以选任意个数字,只能从左往右选。
偶数步答案加上这个数,奇数步减去这个数。
问你最大答案。
题解:
对于一个递减区间,只能加上最高,减去最低,在中间部分不可能有操作(会使答案减小)。
例如:
[0,4]段单调递减。
如果加上a[0],减去a[4],则在[0,4]这段区间内不可能再有任何有用的选择。
所以贪心策略:
找出每一个递减区间,加波峰,减波谷。
另外对于最后一个区间,不用减波谷。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX_N 150005 5 6 using namespace std; 7 8 int n; 9 int ans=0; 10 int cnt=0; 11 int a[MAX_N]; 12 13 int main() 14 { 15 cin>>n; 16 for(int i=0;i<n;i++) 17 { 18 cin>>a[i]; 19 } 20 a[n]=0; 21 for(int i=0;i<n;i++) 22 { 23 if(!(cnt&1) && a[i]>a[i+1]) 24 { 25 ans+=a[i]; 26 cnt++; 27 } 28 if((cnt&1) && a[i]<a[i+1]) 29 { 30 ans-=a[i]; 31 cnt++; 32 } 33 } 34 cout<<ans<<endl; 35 }