主要有两种做法:

乱搞和dp

dp相对来说考虑的特殊情况少一些

最重要的一点就是:

为了避免类似:(1 2 2 2 1 )的情况,

我们需要一个q记录“前”一个数

p记录当前数

判断时 p > ( < ) q & &  p > ( a [ i + 1 ] )即可

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=100010;
 5 int f[N],a[N],n;
 6 int read(){
 7     int sum=0;
 8     char ch=getchar();
 9     while (ch<'0'||ch>'9')
10         ch=getchar();
11     while (ch>='0'&&ch<='9'){
12         sum=sum*10+ch-'0';
13         ch=getchar();
14     }
15     return sum;
16 }
17 int main(){
18     int judge,p,q;
19     n=read();
20     for (int i=1;i<=n;i++)
21         a[i]=read();
22     f[1]=1;
23     if (a[2]>a[1])
24         judge=1;
25     else 
26         judge=0;
27     if (a[2]!=a[1])
28         p=a[2];
29     else 
30         p=a[1];
31     q=a[1];
32     for (int i=2;i<n;i++){
33         if (judge){
34             f[i]=f[i-1];
35             if (p>q&&p>a[i+1])
36                 f[i]+=1;
37             if (a[i+1]<p) 
38                 judge=0;
39         }
40         else{
41             f[i]=f[i-1];
42             if (p<q&&p<a[i+1])
43                 f[i]+=1;
44             if (a[i+1]>p)
45                 judge=1;
46         }
47         if (a[i+1]!=a[i]){
48             q=a[i];
49             p=a[i+1];
50         }
51         else
52             p=a[i];
53             
54     }
55     f[n]=f[n-1]+1;
56     printf("%d",f[n]);
57     return 0;
58 }
STD

 

posted on 2016-10-30 20:41  Absolutezero  阅读(204)  评论(0编辑  收藏  举报