您的位置:首页 > 编程语言 > C语言/C++

PAT 甲级 1101 Quick Sort (25分) C++

2020-06-24 04:26 399 查看

1101 Quick Sort (25分)

感觉不算是一个排序题

题目大意:给定一个序列,检查每个元素是不是主元。

主元需要满足两个条件:

  1. 序列有序以后,其位置不变;
  2. 在原始序列中,主元比所有前面的元素值要大,比后面的元素值要小。

需要思考的地方:我感觉是第二个条件,不能够在检查序列每一个元素的同时,对前面或后面找到最小和最大元素(超时)。
可以将排序后的数列与原始数列进行逐个对比,并且记住当前原始数列的最大值,如果位置没有改变,则判断其是否大于前面所有元素(只需检查前半部分,如果前面有大于当前元素的元素,而当前元素的位置不变,那后半部分一定有小于当前元素的元素)

还有一个小tips:当不存在主元时,在输出数量以后,需要输出一个空行(测试点2)

#include<iostream>                  //输入输出流头文件
#include<stdio.h>                   //标准输入输出
#include<stdlib.h>
#include<algorithm>                 //C++标准模板库的函数
#include<vector>                    //变长数组容器
using namespace std;                //标准命名空间
int cmp(const void *a,const void *b){
return *(int*)a-*(int*)b;
}
int main(){                         //主函数
#ifdef ONLINE_JUDGE                 //如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#else
freopen("1.txt", "r", stdin);   //从1.txt输入数据
#endif
int n,count=0,max=0;
cin>>n;
int *inp=new int[n];
int *nn=new int[n];
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
inp[i]=x;
nn[i]=x;
}
qsort(inp,n,sizeof(int),cmp);//看到题目,下意识地用了qsort,其是sort就可以的
//  sort(inp,inp+n);
vector<int> ans;
for(int i=0;i<n;i++){
if(nn[i]==inp[i]&&nn[i]>max)
{
count++;
ans.push_back(nn[i]);
}
if(nn[i]>max)max=nn[i];
}
cout<<count<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-1)cout<<' ';
}
cout<<endl;
return 0;                       //返回0,如果不返回0,PAT会报错
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: