pat乙级1045

从左到右扫描时记录扫描到当前下标为止的最大值,如果当前元素大于这个最大值,那么它就大于它左边的所有值。同理,从右到左扫描记录扫描到当前下标为止的最小值,如果当前元素小于这个最大小值,那么它就小于它右边的所有值。

这样只需线性级别的时间。

第一次提交一个测试点格式错误,后来查看柳婼的博客发现当主元数为0时需要输出空行,因为题目要求输出两行,因此最后加一空行。

 1 #include <iostream>
 2 #include <vector>
 3 #include <math.h>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     int n;
11     cin >> n;
12     vector<bool> v1(n), v2(n);
13     vector<int> num(n);
14     int max = -1;
15     for (int i = 0; i < n; i++)
16     {
17         cin >> num[i];
18         if (num[i] > max)
19         {
20             v1[i] = true;
21             max = num[i];
22         }
23     }
24     int min = pow(10, 9) + 1;
25     for (int i = n - 1; i >= 0; i--)
26     {
27         if (num[i] < min)
28         {
29             v2[i] = true;
30             min = num[i];
31         }
32     }
33     vector<int> result;
34     for (int i = 0; i < n; i++)
35     {
36         if (v1[i] && v2[i])
37             result.push_back(num[i]);
38     }
39     cout << result.size() << endl;
40     sort(result.begin(), result.end());
41     for (int i = 0; i < result.size(); i++)
42     {
43         if (i) cout << " ";
44         cout << result[i];
45     }
46     cout << endl;
47     return 0;
48 }

 

posted @ 2018-03-11 21:19  bloglxc  阅读(133)  评论(0编辑  收藏  举报