一开始感觉想法很直接,于是就写了,结果有两个测试样例没过,如下。
#include<iostream>
#include<vector>
#include<cmath>
#include <climits>
#include <cfloat>
using namespace std;
int main()
{
int N;
cin>>N;
vector<double> a(N+1);
double maxn=DBL_MIN,minx=DBL_MAX,s=0;
for(int i=1;i<=N;i++)
{
cin>>a[i];
maxn=a[i]>maxn?a[i]:maxn;
minx=a[i]<minx?a[i]:minx;
}
for(int i=1;i<=N;i++)
if(a[i]!=maxn&&a[i]!=minx)
s+=a[i];
double avg=s*1.0/(N-2);
double dmax=DBL_MIN;
for(int i=1;i<=N;i++)
{
if(a[i]!=maxn&&a[i]!=minx)
{
dmax=fabs(a[i]-avg)>dmax?fabs(a[i]-avg):dmax;
}
}
printf("%.2lf %.2lf\n",avg,dmax);
return 0;
}
后来找了半天才找到,就是这个是去掉一个最大值和一个最小值,但是可能存在多个最大值和多个最小值,如果按照我上述写的,那么就是去掉了所有的最大值和最小值了,所以正确的应该是记录最大值和最小值的下标即可,最后利用下标来解决。
#include <iostream>
#include <vector>
#include <cmath>
#include <climits>
#include <cfloat>
using namespace std;
int main(){
int N, maxIdx, minIdx;
cin >> N;
vector<double> a(N + 1);
double maxv = DBL_MIN, minv = DBL_MAX, s = 0;
for (int i = 1; i <= N; i++) {
cin >> a[i];
s += a[i];
if(maxv < a[i]) maxv = a[i], maxIdx = i;
if(minv > a[i]) minv = a[i], minIdx = i;
}
double avg = (s - maxv - minv) / (N - 2);
double dmax = 0;
for (int i = 1; i <= N; i++) {
if (i != maxIdx && i != minIdx) {
dmax = max(fabs(a[i] - avg), dmax);
}
}
printf("%.2lf %.2lf\n", avg, dmax);
return 0;
}