題目連結: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 }