Description
给出n个数,先要求去掉前n1大的和前n2小的之后的平均值
Input
多组输入,每组用例第一行为三个整数n1,n2和n,第二行n个整数,以0 0 0结束输入(1<=n1, n2<=10, n1+n2 < n<=5,000,000)
Output
输出去掉前n1大和前n2小之后的平均值
Sample Input
1 2 5
1 2 3 4 5
4 2 10
2121187 902 485 531 843 582 652 926 220 155
0 0 0
Sample Output
3.500000
562.500000
Solution
简单题,开两个10的数组记录前n1大的数和前n2小的数,在输入过程中首先是累加和,然后不断更新这两个数组中的值,最后拿总和减去这两个数组的和除以n-n1-n2即为答案
Code
#include<stdio.h>
#define INF 1<<30
typedef long long ll;
int main()
{
int n1,n2,n,d,max[11],min[11];
double sum;
while(scanf("%d%d%d",&n1,&n2,&n),n1+n2+n)
{
for(int i=0;i<11;i++)//初始化
max[i]=0,min[i]=INF;
sum=0;//总和
for(int k=0;k<n;k++)
{
scanf("%d",&d);
sum+=d;
for(int i=1;i<=n1;i++)//更新最大值数组
if(d>max[i])
{
for(int j=n1;j>i;j--)
max[j]=max[j-1];
max[i]=d;
break;
}
for(int i=1;i<=n2;i++)//更新最小值数组
if(d<min[i])
{
for(int j=n2;j>i;j--)
min[j]=min[j-1];
min[i]=d;
break;
}
}
for(int i=1;i<=n1;i++)sum-=max[i];//去掉前n1大的
for(int i=1;i<=n2;i++)sum-=min[i];//去掉前n2小的
printf("%.6f\n",sum/(n-n1-n2));
}
return 0;
}