给你5000000个数,找出前n1个最大 的和前n2个最小的,由于n1和n2都很小,直接维护两个数组保存要求的最大最小值,每输入一个数字更新两个数组就行了。
#include<stdio.h>
#include<iostream>
using namespace std;
const int inf=100000009;
int n1,n2,n,ma[11],mi[11];
int main()
{
// freopen("test.txt","r",stdin);
while(scanf("%d%d%d",&n1,&n2,&n) && n1*n2*n)
{
double sum=0;
memset(ma,0,sizeof(ma));
for(int i=1;i<=n2;i++) mi[i]=inf;
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
sum+=a;
for(int j=1;j<=n1;j++)
{
if(a>=ma[j])
{
for(int k=n1;k>j;k--)
ma[k]=ma[k-1];
ma[j]=a;
break;
}
}
for(int j=1;j<=n2;j++)
{
if(a<=mi[j])
{
for(int k=n2;k>j;k--)
mi[k]=mi[k-1];
mi[j]=a;
break;
}
}
}
for(int i=1;i<=n1;i++) sum-=ma[i];
for(int i=1;i<=n2;i++) sum-=mi[i];
printf("%.6f\n",sum/(n-n1-n2));
}
return 0;
}