【NOIP2013】花匠

本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P1970


好多人都说用DP,其实无所谓,反正贪心就够了。

我们想,第1盆一定要选,因为如果第2盆更矮,那么选择第1盆可以更优,如果第2盆更高,其实也是更优的,我们向下讨论第3盆,就会发现推到最后一定是对的;如果第1盆和第2盆一样高,那么选择哪盆是无所谓的。其实第1盆选择好后,那么接下来的选择其实也就确定了,可以发现就是要选择整个序列的最长波动子序列,挑出整个序列的波峰和波谷就好。但是别忘记相同元素的去重。

 1 #include <cstdio>
 2 
 3 inline int get_num() {
 4     int num = 0;
 5     char c = getchar();
 6     while (c < '0' || c > '9') c = getchar();
 7     while (c >= '0' && c <= '9')
 8         num = num * 10 + c - '0', c = getchar();
 9     return num;
10 }
11 
12 const int maxn = 1e5 + 5;
13 
14 int h[maxn], ans;
15 
16 int main() {
17     int n = get_num();
18     for (int i = 1; i <= n; ++i)
19         h[i] = get_num();
20     for (int i = 1; i <= n; ++i) {
21         if (i == 1 || i == n || (h[i] > h[i - 1] && h[i] > h[i + 1]) || (h[i] < h[i - 1] && h[i] < h[i + 1]))
22             ++ans;
23         if (i > 1 && i < n && h[i] == h[i + 1]) h[i] = h[i - 1];
24     }
25     printf("%d", ans);
26     return 0;
27 }
AC代码
原文地址:https://www.cnblogs.com/Mr94Kevin/p/9865388.html