代码改变世界

1448. Antimonotonicity

2011-05-19 13:08  Min·zc  阅读(322)  评论(0编辑  收藏  举报
 1 /*
 2  *使用tmp来记录队列的最后一个数flag来记录数列是应该增还是减
 3  *如果数列要增
 4  *    1.如果数列要增那么如果下一个数字比tmp大,那么成立,ans加一,flag变为减
 5  *    2,如果下一个数比cmp小,那么就把当前队列的最后一个数cmp换成小的那个数,因为我们需要找的数字要比队列的最后一个数字大,
 6  *       所以如果队列的最后一个数字越小,那么比他大的数字就越好找,所以长度就越长。因为对于队列尾的形式为   大小(tmp)大(待求),
 7  *       所以如果我们将cmp换成一个比他小的数也不会影响原来的队列,原来队列的长度ans不变
 8  *数列要减的情况同上
 9  *
10  *
11  */
12 
13 #include <iostream>
14 
15 
16 #include <memory.h>
17 using namespace std;
18 int n;
19 int main()
20 {
21         int t;
22         cin>>t;
23         while(t--)
24         {
25                 int ans=1;
26                 int tmp;
27                 int flag=1;
28                 cin>>n>>tmp;
29                 for(int i=1;i<n;i++)
30                 {
31                         int b;
32                         cin>>b;
33                         if(flag)
34                         {
35                                 if(b<tmp)
36                                 {
37                                         tmp=b;
38                                         ans++;
39                                         flag=0;
40                                 }
41                                 else
42                                         tmp=b;
43                         }
44                         else
45                         {
46                                 if(b>tmp)
47                                 {
48                                         tmp=b;
49                                         ans++;
50                                         flag=1;
51                                 }
52                                 else
53                                         tmp=b;
54                         }
55                 }
56                 cout<<ans<<endl;
57         }
58 }