首页 > 代码库 > poj 2833 The Average

poj 2833 The Average

题目链接:http://poj.org/problem?id=2833

思路:

由于数据量较大,超出存储范围,使用不能使用数组存储数据在进行排序。考虑维护一个最大堆与最小堆,依次读取数据,记录数据中的n1个最大数字与n2个最小数据,所有数据累计和减去堆中数据即可。

注:注意使用记录n2个最大数据要使用最小堆,因为每一个数据需要与该堆中最小值比较,同理,记录n1个最小数据要使用最大堆。

 

代码:

 

#include <iostream>#include <queue>using namespace std;struct cmp{    bool operator()( const int a, const int b ) { return a > b; }};priority_queue<int>MaxHeap;priority_queue<int, vector<int>, cmp >MinHeap;int main(){    int n1, n2, n;    double Sum = 0, Ave;    while ( scanf( "%d %d %d", &n1, &n2, &n ) != EOF )    {        int Tmp, CountMin, CountMax;        Sum = CountMin = CountMax = 0;        if ( n1 == 0 && n2 == 0 && n == 0 )            break;        for ( int i = 0; i < n; ++i )        {            scanf( "%d", &Tmp );            Sum += Tmp;            if ( CountMin < n1 )            {                CountMin++;                MinHeap.push( Tmp );            }            else            if ( Tmp > MinHeap.top() )            {                MinHeap.pop();                MinHeap.push( Tmp );            }                        if ( CountMax < n2 )            {                CountMax++;                MaxHeap.push( Tmp );            }            else            if ( Tmp < MaxHeap.top() )            {                MaxHeap.pop();                MaxHeap.push( Tmp );            }        }        while ( !MaxHeap.empty() )        {            int Tmp = MaxHeap.top();            MaxHeap.pop();            Sum -= Tmp;        }        while ( !MinHeap.empty() )        {            int Tmp = MinHeap.top();            MinHeap.pop();            Sum -= Tmp;        }        Ave = Sum / ( n - n1 - n2 );        printf( "%.6f\n", Ave );    }    return 0;}

 

poj 2833 The Average