【洛谷p1970】花匠

莫得致敬lz谢谢。lz的题解是优秀的题解谢谢!

看算法标签

但是我并不会DP的思路,用一个很神奇的码量超级少的代码(虽然我码了超多),然后其实这个数据可以看做是一个函数嘛对吧:(比如说样例)

那么要注意题意是偶点只能满足条件A,B中的一个,而不是都可以满足;

然后这道题的思路就是很简单的:

寻找共有几段单调区间,然后+1;就是最终答案;

但是吧,咱不会证明:

然后代码实现应该也不是太难:

#include<bits/stdc++.h>

using namespace std;

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

int n,a,m,nxt;
int sj;//up is 1 and drop is 0 nothing is 2

int main() {
    n=read();nxt=read();
    if(n==1) {
        printf("1");
        return 0;
    }
    a=read();
    if(a>nxt) sj=1;if(a<nxt) sj=0;if(a==nxt) sj=2;
    nxt=a;m=1;
    for(int i=3; i<=n; i++) {
        a=read();
        if(sj==2) {
            if(a>nxt) {sj=1;nxt=a;continue;}
            if(a<nxt) {sj=0;nxt=a;continue;}
            if(a==nxt) {nxt=a;continue;}
        }
        if(sj) {
            if(a>=nxt) {nxt=a;continue;} 
            else {m++;sj=0;nxt=a;}
        } else {
            if(a<=nxt) {nxt=a;continue;} 
            else {m++;sj=1;nxt=a;}
        }
    }
    cout<<m+1<<endl;
    return 0;
}//lz因为代码太长疯狂压行

end-

原文地址:https://www.cnblogs.com/zhuier-xquan/p/11131507.html