http://acm.pku.edu.cn/JudgeOnline/problem?id=2833
题意是求出去n1个最大值,n2个最小值后剩下的数的平均值,由于内存限制、不能完全存储、所以选择存储n1个最大值和n2个最小值,然后再用总和减去它们即可!
#include <cstdio>
#include <algorithm>
using namespace std;
__int64 max_t[11],min_t[11],total,data;
int main()
{
int i,n1,n2,n;
double ave;
while(1)
{
memset(max_t,0,sizeof(max_t));
memset(min_t,100000001,sizeof(min_t));//初始化数组
total = 0;
scanf("%d%d%d",&n1,&n2,&n);
if(n1+n2+n == 0)
break;
for(i = 0;i < n;i ++)
{
scanf("%I64d",&data);
total = total+data;//求总和
sort(max_t,max_t+n1);//对存储最大值的数组排序
sort(min_t,min_t+n2);//对存储最小值的数组排序
if(data > max_t[0])//与最大值数组中的最大值比较
max_t[0] = data;
if(min_t[n2-1] > data)//与最小值数组中的最小值比较
min_t[n2-1] = data;
}
for(i = 0;i < n1;i ++)
total = total - max_t[i];
for(i = 0;i < n2;i ++)
total = total - min_t[i];
ave = total/(double)(n-n1-n2);//求平均值
printf("%.6lf/n",ave);
}
return 0 ;
}
/*
1 2 5
1 2 3 4 5
4 2 10
2121187 902 485 531 843 582 652 926 220 155
0 0 0
3.500000
562.500000
*/