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