1045 快速排序

大致题意就是判断给出序列中,哪些元素是主元,即主元元素大于等于其左边的最大值,小于等于其右边的最小值。

例如,1 , 3, 2, 4, 5

 1<=1 <=2,所以1是主元。

4<=4<=5,所以4是主元。

5<=5<=INF,所以5是主元。

坑点:输出结束后,必须加一个换行符,不然测试点2显示格式错误!

#include<iostream>
#include<algorithm>
using namespace std;

const int INF = 0x3fffffff;
//当前位置的元素必须满足,大于等于左边的最大元素,小于等于右边的最小元素,才可能是主元
int a[100010] = {0};
int leftMAX[100010] = {0};
int rightMIN[100010] = {0};
int ans[100010] = {0},num = 0;
int main() {
	int n,cnt = 0;
	scanf("%d",&n);
	for(int i = 1; i <= n; ++i)
		scanf("%d",&a[i]);
	rightMIN[n+1] = INF;
	for(int i = 1; i <=n; ++i)
		leftMAX[i] = max(leftMAX[i-1],a[i]);
	for(int i = n; i>=1; --i)
		rightMIN[i] = min(rightMIN[i+1],a[i]);
	for(int i = 1; i <= n; ++i) {
		if(a[i] >= leftMAX[i] && a[i] <= rightMIN[i]) {
			cnt++;
			ans[num++] = a[i];
		}
	}
	printf("%d\n",cnt);
	for(int i = 0; i < num; ++i) {
		if(i > 0) printf(" ");
		printf("%d",ans[i]);
	}
	printf("\n");//不加这句,测试点2无法通过 
	return 0;
}

 

posted @ 2020-02-19 21:20  tangq123  阅读(143)  评论(0编辑  收藏  举报