题意:给定一些正数,去掉给定个数的最大值和给定个数的最小值,输出其余数字的平均数。
思路:建立一个大顶堆,一个小顶堆。大顶堆的大小为去掉的最小值个数,存放当前的若干最小值。遍历数据的同时维护这两个堆,最后堆中的数据即为需要去掉的数据。
输入:
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
#include <stdio.h>
#include <string.h>
#define N 15
int n1,n2,n;
int heap1[N],heap2[N];
void update1(int i){
int x;
x = heap1[i];
i <<= 1;
while(i<=n1){
if(i+1<=n1 && heap1[i+1]<heap1[i])
i++;
if(x > heap1[i])
heap1[i/2] = heap1[i];
else
break;
i <<= 1;
}
heap1[i/2] = x;
}
void update2(int i){
int x;
x = heap2[i];
i <<= 1;
while(i<=n2){
if(i+1<=n2 && heap2[i+1]>heap2[i])
i++;
if(x < heap2[i])
heap2[i/2] = heap2[i];
else
break;
i <<= 1;
}
heap2[i/2] = x;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d %d %d",&n1,&n2,&n)){
int i,j,k;
double res = 0;
if(!n1&&!n2&&!n)
break;
for(i = 1;i<=n;i++){
scanf("%d",&j);
res += (double)j/(n-n1-n2);
if(i<=n1){
heap1[i] = j;
if(i == n1)
for(k = n1/2;k>=1;k--)
update1(k);
}
else if(j>heap1[1]){
heap1[1] = j;
update1(1);
}
if(i<=n2){
heap2[i] = j;
if(i == n2)
for(k = n2/2;k>=1;k--)
update2(k);
}
else if(j<heap2[1]){
heap2[1] = j;
update2(1);
}
}
for(i = 1;i<=n1;i++)
res -= (double)heap1[i]/(n-n1-n2);
for(i = 1;i<=n2;i++)
res -= (double)heap2[i]/(n-n1-n2);
printf("%.6lf\n",res);
}
return 0;
}
1万+



被折叠的 条评论
为什么被折叠?



