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;
}


浙公网安备 33010602011771号