这道题,一看挺简单的,但是明显爆内存,所以sort行不通;
只有换一种方式:优先队列:
首先我应该知道(队列):
然后:
1.优先队列定义形式(这里是对int类型):
priority_queue<int> pq;//放元素的时候大小是按照大到小的顺序存放的;
priority_queue<int,vector<int>,greater<int> > pq;//放元素的时候大小是按照由小到大的顺序存放的;
优先队列常用函数:
pq.top();//访问头部元素
pq.push(元素);//加入元素到尾部
pq.pop();//弹出头部元素
pq.size();//元素的个数
pq.empty();//空返回true,非空false
然后这道题就可以这样理解来解决;比如求n1个大的数,就用小到大的排序方式的priority_queue<int,vector,greater >:
进去一个元素,该元素如果足够小,那么就会自动到pq的头部去,所以当pq.size()>n1的时候就应该弹出头部小的元素,依次这样下去,最后保留的就是n1个大的元素了;
同理求n2个小的也一样;
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
int main(){
int n1,n2,n,a;
priority_queue<int> h;//由大到小
priority_queue<int,vector<int>,greater<int> > l;//由小到大
while(scanf("%d %d %d",&n1,&n2,&n)){
if(n1==n2&&n2==n&&n==0)break;
ll ans=0;
for(int i=0;i<n;i++){
scanf("%d",&a);
ans+=a;//先求总和
h.push(a);
if(h.size()>n2) h.pop();//求n2个小的
l.push(a);
if(l.size()>n1) l.pop();//求n1个大的
}
while(h.size()){
ans-=h.top();
h.pop();
}
while(l.size()){
ans-=l.top();
l.pop();
}
printf("%0.6lf\n",ans*1.0/(n-n1-n2));
}
return 0;
}