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

Leohh發表於2017-09-19

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

 

相關文章