首页 > 其他 > 详细

洛谷P1970 花匠

时间:2019-04-04 20:34:24      阅读:132      评论:0      收藏:0      [点我收藏+]

传送门

首先可以知道,如果一个序列是连续上升的,那么只需要取这一个序列中最高的元素即可,因为取其它的不能保证大于后面的.连续下降的序列同理.而这些恰好就是波峰和波谷.

所以遇到 $ j $ 比之前的 $ i $ 大,那么在 $ j $ 之后找比 $ j $ 小的最小的 $ k $ ,反过来也是一样.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define re register
using namespace std ;
const int maxn = 1000005 ;

inline int read () {
    int f = 1 , x = 0 ;
    char ch = getchar () ;
    while(ch > '9' || ch < '0') {if(ch == '-')  f = -1 ; ch = getchar () ;}
    while(ch >= '0' && ch <= '9')  {x = (x << 1) + (x << 3) + ch - '0' ; ch = getchar () ;}
    return x * f ;
}

int n , h[maxn] ;
int flag , ans = 1 ;

int main () {
    n = read () ;
    for(re int i = 1 ; i <= n ; ++ i)  h[i] = read () ;
    for(re int i = 1 ; i < n ; ++ i) {
        if(h[i] < h[i + 1] && flag != 1) {
            flag = 1 ;
            ans ++ ;
        }
        if(h[i] > h[i + 1] && flag != 2) {
            flag = 2 ;
            ans ++ ;
        }
    }
    printf("%d\n" , ans ) ;
    return 0 ;
}

洛谷P1970 花匠

原文:https://www.cnblogs.com/Stephen-F/p/10656689.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!