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