本题在洛谷上的链接: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 }