思路

与上一题几个PAT思路类似,这题的难点在于两个数组的设置,一开始没想到
两个数组一个leftMax记录左边最大的值,rightMin记录右边最小的值

代码

  1. #include<vector>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdio>
  5. using namespace std;
  6. const int INT_MAX = 10000000000;
  7. int main(){
  8. int n, count = 0;
  9. scanf("%d",&n);
  10. vector<int> input(n), leftMax(n), rightMin(n), ans;
  11. for(int i = 0; i < n; i++) scanf("%d",&input[i]);
  12. leftMax[0] = 0, rightMin[n-1] = INT_MAX;
  13. for(int i = 1; i < n; i++){
  14. leftMax[i] = max(leftMax[i-1],input[i-1]);
  15. //if(input[i-1]>leftMax[i-1])leftMax[i] = input[i-1];
  16. }
  17. for(int i = n - 2; i >= 0; i--){
  18. rightMin[i] = min(rightMin[i+1],input[i+1]);
  19. //if(input[i+1]<rightMin[i+1]) rightMin[i] = input[i+1];
  20. }
  21. for(int i = 0; i < n; i++){
  22. //printf("input[%d] = %d, rightMin[%d] = %d, leftMax[%d] = %d\n",i,input[i],i,rightMin[i],i,leftMax[i]);
  23. if(input[i]<=rightMin[i]&&input[i]>=leftMax[i]){
  24. count++;
  25. ans.push_back(input[i]);
  26. }
  27. }
  28. sort(ans.begin(),ans.end());
  29. printf("%d\n",count);
  30. for(int i = 0; i < count; i++) {
  31. printf("%d",ans[i]);
  32. if(i<count-1)printf(" ");
  33. }
  34. printf("\n");
  35. return 0;
  36. }