poj2833(错误)

#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;
}

猜你喜欢

转载自blog.csdn.net/m0_43400575/article/details/84637114
POJ