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

题目链接: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 }

 

posted @ 2017-09-19 23:49  Leohh  阅读(254)  评论(0编辑  收藏  举报