题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805278589960192
超时代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <string.h>
using namespace std;
const int maxn=100010;
int a[maxn];//记录输入元素
int b[maxn];//记录可能为主元的元素
int main(){
int n;
cin>>n;
int cnt=0;//记录主元个数
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
bool left_flag=true;//主元左边元素是否都小于主元
bool right_flag=true;//主元右边元素是否都大于主元
for(int j=1;j<i;j++){
if(a[j]>a[i]){
left_flag=false;
break;
}
}
// cout<<left_flag<<endl;//错误判断
for(int j=i+1;j<=n;j++){
if(a[j]<a[i]){
right_flag=false;
break;
}
}
// cout<<right_flag<<endl;//错误判断
if(left_flag&&right_flag){
b[cnt++]=a[i];
}
}
cout<<cnt<<endl;
sort(b,b+cnt);
for(int i=0;i<cnt;i++){
if(i==0){
cout<<b[i];
}
else {
cout<<" "<<b[i];
}
}
return 0;
}
判定结果:
经验:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <string.h>
using namespace std;
const int maxn=100010;
int a[maxn];//记录输入元素
int b[maxn];//记录可能为主元的元素
int c[maxn];//记录原数组排序后的结果
int main(){
int n;
cin>>n;
int cnt=0;//记录可能为主元的个数
for(int i=0;i<n;i++){//一般情况下,i从0到n,不要用1-n(习惯问题)
cin>>a[i];
c[i]=a[i];
}
sort(c,c+n);
int maxn_=0;
for(int i=0;i<n;i++){
if(maxn_<a[i])
//找到前i个元素中最大的,
maxn_=a[i];
if(a[i]==c[i]&&c[i]==maxn_){
//1,主元应该在排序完之后,位置不变
//2,第i个元素应该比前i个的最大值大,后面的元素一定比第i个元素大(因为排完序了)
b[cnt++]=a[i];
}
}
cout<<cnt<<endl;
if(cnt==0)
cout<<endl;//如果主元个数为0,输出空行(测试点2:格式错误)
sort(b,b+cnt);
for(int i=0;i<cnt;i++){
if(i==0){
cout<<b[i];
}
else {
cout<<" "<<b[i];
}
}
return 0;
}