CCF201612-1 中间数
题目:
题目分析:
求数组中间数,先排序,在统计即可。
此题给了我一些启发:
代码1:(通过,但有点繁琐)
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[1010],M,m;
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n); //排序
for(int i=0;i<n;i++){ //统计
if(a[n/2]>a[i])m++; //比中间数小
if(a[n/2]<a[i])M++; //比中间数大
}
if(m==M){ //统计,找到输出,退出
cout<<a[n/2]<<endl;
return 0;
}
else if(n%2==1){ //没有找到,且n为奇数
cout<<-1<<endl;
return 0;
}
//n为偶数,还需要判断a[n/2+1]是否是中位数
for(int i=0;i<n;i++){
if(a[n/2+1]>a[i])m++;
if(a[n/2+1]<a[i])M++;
}
if(m==M) cout<<a[n/2+1]<<endl;
else cout<<-1<<endl;
return 0;
}
由于一开始纠结于n为偶数还是奇数,所以代码写得比较繁琐,后来经过思考,我发现偶数情况只需要验证中间位置两个数的其中一个即可,因为如果有中间数,它们应该相等,没有中间数,那么任何一个都不是中间数。
所以,代码修改如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[1010],M,m;
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n); //排序
for(int i=0;i<n;i++){ //统计
if(a[(n-1)/2]>a[i])m++; //等价于if(a[n/2]>a[i])m++;
if(a[(n-1)/2]<a[i])M++; //等价于if(a[n/2]<a[i])M++;
}
if(m==M) cout<<a[n/2]<<endl;
else cout<<-1<<endl;
return 0;
}