代码写的很挫,需要处理的特殊情况是分数最小的包括id最小的时候,要保留id最小的。我按照分数从大到小排序,分数相等时按照id从小到大排序,这样,可能出错的是a[0]和a[1],当两者的pi相等时,需要交换一下两者的位置。
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n;
struct Node{
int id;
double pi;
};
int cmp1(Node n1,Node n2){
if(n1.pi!=n2.pi) return n1.pi>n2.pi;
else return n1.id<n2.id;
}
Node a[25];
int main(){
while(scanf("%d",&n)&&n){
int cnt=1;
for(int i=0;i<n;i++){
scanf("%lf",&a[i].pi);
a[i].id=cnt++;
}
sort(a,a+n,cmp1);//这儿写成cnt了,导致WA了一次
if(a[0].pi==a[1].pi){
Node tmp=a[1];
a[1]=a[0];
a[0]=tmp;
}
double sum=0,avg=0;
for(int i=1;i<n-1;i++)
sum+=a[i].pi;
avg=sum/(n-2);
//输出和平均分最接近的
double res=99999999;
int ans;
for(int i=1;i<n-1;i++){
if(res>(double)fabs(a[i].pi-avg)){
res=fabs(a[i].pi-avg);
ans=a[i].id;
}
}
printf("%d\n",ans);
}
//system("pause");
return 0;
}