#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
float data[5000009];
const int M_xx = 0x7fffffff;
double heap1[20],heap2[20];
int len1,len2;
double heap1big,heap2small;
int father(int i)
{
return i/2;
}
int left(int i)
{
return i*2;
}
int right(int i)
{
return i*2+1;
}
void MAX_heap(int i,int heapsize) //最小的在上
{
int l=left(i),r=right(i);
int large=i;
if((l<=heapsize)&&(heap1[large]>heap1[l]))
large=l;
if((r<=heapsize)&&(heap1[large]>heap1[r]))
large=r;
if(large==i)
return;
else
{
int temp=heap1[large];
heap1[large]=heap1[i];
heap1[i]=temp;
MAX_heap(large,heapsize);
}
}
void MIN_heap(int i,int heapsize)
{
int l=left(i),r=right(i);
int minn=i;
if((l<=heapsize)&&(heap2[minn]>heap2[l]))
minn=l;
if((r<=heapsize)&&(heap2[minn]>heap2[r]))
minn=r;
if(minn==i)
return;
else
{
int temp=heap2[minn];
heap2[minn]=heap2[i];
heap2[i]=temp;
MAX_heap(minn,heapsize);
}
}
void BUILT_HEAP(int key,int heapsize1,int heapsize2)
{
int i=0;
if(len1<heapsize1)
{
len1++;
heap1[len1]=key;
i=len1;
while((i>=1)&&(heap1[i]<heap1[father(i)]))
{
int temp=heap1[i];
heap1[i]=heap1[father(i)];
heap1[father(i)]=heap1[i];
i=father(i);
}
if(key>heap1big)
heap1big=key;
}
if(len2<heapsize2)
{
len2++;
heap2[len2]=key;
i=len2;
while((i>=1)&&(heap2[i]>heap2[father(i)]))
{
int temp=heap2[i];
heap2[i]=heap2[father(i)];
heap2[father(i)]=temp;
i=father(i);
}
if(heap2small>key)
heap2small=key;
}
if((len1>heapsize1)&&(key>=heap1big))
{
int temp=0;
len1++;
heap1[len1]=key;
i=len1;
while((i>=1)&&(heap1[i]<heap1[father(i)]))
{
temp=heap1[i];
heap1[i]=heap1[father(i)];
heap1[father(i)]=heap1[i];
i=father(i);
}
heap1[1]=heap1[len1];
len1--;
MAX_heap(1,heapsize1);
}
if((len2>heapsize2)&&(key<=heap2small))
{
int temp=0;
len2++;
heap2[len1]=key;
i=len2;
while((i>=1)&&(heap2[i]<heap2[father(i)]))
{
temp=heap2[i];
heap2[i]=heap2[father(i)];
heap2[father(i)]=heap2[i];
i=father(i);
}
heap2[1]=heap2[len2];
len2--;
MIN_heap(1,heapsize2);
}
}
void heapsort(int n,int n1,int n2)
{
double minn=0,mixx=0,sum=0;
for(int i=1;i<=n;i++)
{
BUILT_HEAP(data[i],n1,n2);
}
minn=heap2[1],mixx=heap1[1];
for(int i=2;i<=n1;i++) //最大的取最小,最小的取最大
{
if(mixx>heap1[i])
mixx=heap1[i];
}
for(int i=2;i<=n2;i++)
{
if(minn<heap2[i])
minn=heap2[i];
}
for(int i=1;i<=n;i++)
{
if((data[i]<mixx)&&(data[i]>minn))
sum+=data[i];
}
sum=sum/(n-n1-n2);
printf("%.6lf\n",sum);
}
int main()
{
int n1=0,n2=0,n=0;
while((scanf("%d%d%d",&n1,&n2,&n)==3)&&(n1!=0)&&(n2!=0)&&(n!=0))
{
memset(data,0,sizeof(data));
memset(heap1,0,sizeof(heap1));
memset(heap2,0x3f,sizeof(heap2));
len1=0,len2=0,heap1big=0,heap2small=M_xx;
for(int i=1;i<=n;i++)
scanf("%f",&data[i]);
heapsort(n,n1,n2);
}
return 0;
}
poj2833(错误)
猜你喜欢
转载自blog.csdn.net/m0_43400575/article/details/84637114
今日推荐
周排行