Poj--2181(贪心)

2014-10-14 22:32:45

思路:求出结果最大的子序列,奇数位置+,偶数位置- 。发现只要找出整个序列的极大值点和极小值点就可,极大值点要+,极小值点要- 。找完后从头到尾扫一遍,根据需要找点(比如当前是奇数位置,那么就要找下一个极大值点;当前是偶数位置,那么就要找下一个极小值点)

 1 /*************************************************************************
 2     > File Name: 2181.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Tue 14 Oct 2014 10:02:54 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 const int maxn = 150010;
27 
28 int P;
29 int val[maxn];
30 int mk[maxn];
31 
32 int main(){
33     scanf("%d",&P);
34     for(int i = 1; i <= P; ++i){
35         scanf("%d",val + i);
36     }
37     if(val[1] > val[2]) mk[1] = 1;
38     else mk[1] = -1;
39     for(int i = 2; i < P; ++i){
40         if(val[i] >= val[i - 1] && val[i] >= val[i + 1]) mk[i] = 1;
41         else if(val[i] <= val[i - 1] && val[i] <= val[i + 1]) mk[i] = -1;
42     }
43     if(val[P] > val[P - 1]) mk[P] = 1;
44     else mk[P] = 0;
45     int f = 1,ans = 0;
46     for(int i = 1; i <= P; ++i){
47         if(mk[i] == f){
48             ans += f * val[i];
49             f = -f;
50         }
51     }
52     printf("%d\n",ans);
53     return 0;
54 }

 

posted @ 2014-10-14 22:35  Naturain  阅读(255)  评论(0)    收藏  举报