LUOGU P1970 花匠 (Noip 2013)
解题思路
好多大佬用的dp啊,貌似贪心可以做,每次所选的一定是每个连续递增或递减序列的最后,直接模拟就行了,注意判断一下头和尾相等的情况。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 100005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int n,ans,h[MAXN],pre; bool flag; int main(){ n=rd();h[1]=rd();ans=1;; if(n==1) {puts("1");return 0;} h[2]=rd();if(h[2]>h[1]) flag=1;pre=h[2]; for(int i=3;i<=n;i++) { h[i]=rd(); if(!flag){ if(h[i]>pre) {flag=1;pre=h[i];ans++;} else pre=h[i]; } else{ if(h[i]<pre) {flag=0;pre=h[i];ans++;} else pre=h[i]; } }cout<<ans+1<<endl; return 0; }