PAT_A1101
PAT甲级1101.
目录
A1101
题目
样例
输入:
5
1 3 2 4 5
输出:
3
1 4 5
思路和坑点
根据主元的特点,在排好序的所在位置上,且左侧的数都小于自身,右侧的数都大于自身,由于题目中的数字都不同,因此只需要验证一侧即可。排序后,遍历数组一一验证是否满足主元的特征。
坑点
最后要多加一个换行符,估计是0个的情况下,主元不用输出但是仍要占据一行。(这个真是谜之判定)
AC代码
#include<bits/stdc++.h>
using namespace std;
//快速排序的特性,最终所选的主元都在自己应该在的位置上
//并且保证左边的都小于主元,右边的都大于主元
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n;
vector<int> v,s,out;
scanf("%d",&n);
v.resize(n); s.resize(n);
for(int i=0;i<n;i++){ //读入数据
scanf("%d",&v[i]);
s[i]=v[i];
}
int max=-1; //记录左侧的最大值
sort(s.begin(),s.end()); //对其中一个数组进行排序
for(int i=0;i<n;i++){
if(v[i]==s[i]&&v[i]>max) //如果v中的一个元素在自己的排序后的位置上,且左边的数都小于自身
out.push_back(s[i]); //则为主元,因为题中所有的数均不相同,因此一定满足右边的数都大于自身
max=max>v[i]?max:v[i]; //更新左侧最大值
}
cout<<out.size()<<'\n'; //输出结果
for(int i=0;i<out.size();i++){
if(i) putchar(' ');
printf("%d",out[i]);
}
putchar('\n'); //谜之换行符,没有这一句,有一个测试点会格式错误
return 0;
}