PAT 乙级 1045
题目
题目地址:PAT 乙级 1045
题解
本题的解法比较巧妙,刚开始的试着用暴力求解,果不其然时间超限……
变换思路,既然对于每个元素来说满足的条件是前小后大,那么对数组排序,对应的位置相等的即为题设要求的“可能主元”,但是还有一个条件要保证当前是从左向右遍历的最大值;总结一下两个条件:1. 排序后对应位置数字相等;2. 当前操作元素是从左向右遍历中的最大值
同时还要注意,当输入n值为0时,除了需要输出“可能主元”的个数之外,还需要保留换行符‘\n’
代码
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 using namespace std; 5 6 int main() { 7 vector<int> num; 8 vector<int> sortnum; 9 vector<int> result; 10 int n = 0; 11 cin >> n; 12 while (n--) { 13 int tmp = 0; 14 cin >> tmp; 15 num.push_back(tmp); 16 sortnum.push_back(tmp); 17 } 18 sort(sortnum.begin(), sortnum.end()); 19 int maxx = 0; 20 for (int i = 0; i < num.size(); i++) { 21 if (num[i] > maxx) 22 maxx = num[i]; 23 if (num[i] == sortnum[i] && num[i] >= maxx) 24 result.push_back(sortnum[i]); 25 } 26 cout << result.size() << endl; 27 for (int i = 0; i < result.size(); i++) { 28 if (i != result.size() - 1) 29 cout << result[i] << ' '; 30 else 31 cout << result[i]; 32 } 33 cout << endl; 34 35 return 0; 36 }