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 }

浙公网安备 33010602011771号