poj 2833 The Average
2014-09-05 20:19
423 查看
poj 2833 The Average
题意很简单 就是评委给选手打分 去除n1个最高分 n2个最低分 然后算平均分
如果只是简单的用优先队列来存储所有的数 然后根据n1 n2的个数来去除相应的数
会MLE。。这个题目里面 n1+n2的值绝对超过了10
所以就换种想法 用最小优先的队列来存储前n1大的数 最大优先的队列来存储前n2小的数(这个想法很好用啊)
题意很简单 就是评委给选手打分 去除n1个最高分 n2个最低分 然后算平均分
如果只是简单的用优先队列来存储所有的数 然后根据n1 n2的个数来去除相应的数
会MLE。。这个题目里面 n1+n2的值绝对超过了10
所以就换种想法 用最小优先的队列来存储前n1大的数 最大优先的队列来存储前n2小的数(这个想法很好用啊)
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <string.h> #include <string> #include <queue> #define eps 1e-8 #define op operator #define MOD 10009 #define MAXN 100100 #define FOR(i,a,b) for(int i=a;i<=b;i++) #define FOV(i,a,b) for(int i=a;i>=b;i--) #define REP(i,a,b) for(int i=a;i<b;i++) #define REV(i,a,b) for(int i=a-1;i>=b;i--) #define MEM(a,x) memset(a,x,sizeof a) #define ll __int64 using namespace std; int main() { //freopen("ceshi.txt","r",stdin); int n1,n2,n; while(scanf("%d%d%d",&n1,&n2,&n)!=EOF) { if(n1==0&&n2==0&&n==0) break; ll sum=0; int x; priority_queue<int,vector<int>,greater<int> > qmin;//小的优先 来保存大的 priority_queue<int,vector<int>,less<int> > qmax;//大的优先 来保存小的 for(int i=0;i<n;i++) { scanf("%d",&x); qmin.push(x); qmax.push(x); sum+=(ll)x; if(qmin.size()>n1) qmin.pop(); if(qmax.size()>n2) qmax.pop(); } int p; while(!qmin.empty()) { p=qmin.top(); qmin.pop(); sum-=p; } while(!qmax.empty()) { p=qmax.top(); qmax.pop(); sum-=p; } int y=n-n1-n2; double ans=sum/(y*1.0); printf("%.6lf\n",ans); } return 0; }
相关文章推荐
- poj 2833 The Average
- poj 2833 The Average 堆排序
- poj 2833 The Average
- poj 2833 The Average
- poj -- 2833 The Average(优先队列或堆或直接模拟)
- POJ 2833 The Average(水~)
- poj 2833 The Average
- POJ 2833 The Average(nlogn排序)
- poj - 2833- The Average
- POJ 2833 The Average(堆 优先队列)
- POJ-2833 The Average(优先队列)
- POJ 2833 求平均数。 模板:STL实现大根堆和小根堆
- poj 2833
- 【优先队列】poj 2833
- 并查集 Poj 1838 + 1611 + 1962 + Zoj 2833
- POJ 2833 简单模拟
- poj 2833 堆的应用(去若干最大值最小值)
- poj 2833 第k大(小)数字
- pku 2833 The Average
- 2833 The Average 求数组的前k小、大数 最大堆,最小堆 STL