原题目网址:http://poj.org/problem?id=2833

本题中文翻译:

描述

在演讲比赛中,当选手完成演讲时,评委将对他的演出进行评分。 工作人员删除最高成绩和最低成绩,并计算其余成绩的平均值作为参赛者的最终成绩。 这是一个简单的问题,因为通常只有几名评委。

让我们考虑一下上面问题的一般形式。 给定n个正整数,删除最大的n1和最小的n2,并计算其余的平均值。

输入

输入由几个测试用例组成。 每个测试用例由两行组成。 第一行包含三个整数n1,n2和n(1≤n1,n2≤10,n1 + n2 <n≤5,000,000)由一个空格隔开。 第二行包含n个正整数ai(对于所有ai, 1≤i≤n,1≤ai≤10^8)由一个空格隔开。 最后一个测试用例后面跟着三个零。

输出

对于每个测试用例,输出小数点后的平均值,并将其四舍五入为六位数字。

Sample Input

1 2 5

1 2 3 4 5

4 2 10

2121187 902 485 531 843 582 652 926 220 155

0 0 0

Sample Output

3.500000

562.500000

Hint

This problem has very large input data. scanf and printf are recommended for C++ I/O.(不要用cin或cout)

The memory limit might not allow you to store everything in the memory.

(本题无法让你一次性输入整个序列,空间不允许)

解题思路:

先输入n1+n2个数,将这些数排序,分别将最小的n2个放到大根堆里,将最大的n1个放到小根堆里。

每读入一个元素,如果当前元素比大根堆堆顶小,说明堆顶一定参与计算,则将堆顶弹出,将当前元素推进去;如果当前元素比小根堆堆顶大,说明堆顶一定参与计算,则将堆顶弹出,将当前元素推进去;(感性理解一下)

如果不符合上面两项条件,则说明当前元素一定参与计算。

AC代码:

 #include<cstdio>
#include<queue>
#include<algorithm> using namespace std; priority_queue<int > a;//大根堆
priority_queue<int ,vector<int> ,greater<int> > a1;//小根堆
int n,n1,n2,k,ll[];
long long ans;
double ans1; int main() {
while(scanf("%d%d%d", &n1, &n2, &n) == && n1 && n2 && n) {
while (!a.empty()) a.pop();//初始化一定要记得
while (!a1.empty()) a1.pop();//初始化一定要记得
ans = ans1 = ;//初始化一定要记得
for(int i = ;i <= n1 + n2; i++)
scanf("%d",&ll[i]);
sort(ll+,ll+n1+n2+);
for(int i = ;i <= n2; i++)
a.push(ll[i]);
for(int i = n2 + ;i <= n2 + n1; i++)
a1.push(ll[i]);
for(int i = n1+n2+;i <= n; i++) {
scanf("%d",&k);
if(k >= a1.top()) {
ans += a1.top();
a1.pop();
a1.push(k);
continue;
}
if(k <= a.top()) {
ans += a.top();
a.pop();
a.push(k);
continue;
}
ans += k;
}
ans1 = ans;
printf("%.6f\n",ans1 / (n - n1 -n2));
}
return ;
}

POJ 2833 The Average(优先队列)的更多相关文章

  1. poj 2833 The Average(堆)

    题目链接:http://poj.org/problem?id=2833 思路分析:由于数据量较大,超出存储范围,使用不能使用数组存储数据在进行排序.考虑维护一个最大堆与最小堆,依次读取数据, 记录数据 ...

  2. poj 3253 Fence Repair 优先队列

    poj 3253 Fence Repair 优先队列 Description Farmer John wants to repair a small length of the fence aroun ...

  3. poj - 2431 Expedition (优先队列)

    http://poj.org/problem?id=2431 你需要驾驶一辆卡车做一次长途旅行,但是卡车每走一单位就会消耗掉一单位的油,如果没有油就走不了,为了修复卡车,卡车需要被开到距离最近的城镇, ...

  4. poj 3053 Fence Repair(优先队列)

    题目链接:http://poj.org/problem?id=3253 思路分析:题目与哈夫曼编码原理相同,使用优先队列与贪心思想:读入数据在优先队列中,弹出两个数计算它们的和,再压入队列中: 代码如 ...

  5. POJ 2431 Expedition (贪心+优先队列)

    题目地址:POJ 2431 将路过的加油站的加油量放到一个优先队列里,每次当油量不够时,就一直加队列里油量最大的直到能够到达下一站为止. 代码例如以下: #include <iostream&g ...

  6. poj 3253 Fence Repair (优先队列,哈弗曼)

    题目链接:http://poj.org/problem?id=3253 题意:给出n块木板的长度L1,L2...Ln,求在一块总长为这个木板和的大木板中如何切割出这n块木板花费最少,花费就是将木板切割 ...

  7. POJ 1442 Black Box(优先队列)

    题目地址:POJ 1442 这题是用了两个优先队列,当中一个是较大优先.还有一个是较小优先. 让较大优先的队列保持k个.每次输出较大优先队列的队头. 每次取出一个数之后,都要先进行推断,假设这个数比較 ...

  8. POJ 1862 Stripies 贪心+优先队列

    http://poj.org/problem?id=1862 题目大意: 有一种生物能两两合并,合并之前的重量分别为m1和m2,合并之后变为2*sqrt(m1*m2),现在给定n个这样的生物,求合并成 ...

  9. poj 2431 Expedition 贪心+优先队列 很好很好的一道题!!!

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10025   Accepted: 2918 Descr ...

随机推荐

  1. Meteor会话

    会话用于当用户在使用应用程序时保存数据.当用户离开应用这些数据将被删除. 在本教程中,我们将学习如何设置会话对象,存储一些数据并返回数据.我们将使用基本的HTML设置. meteorApp/impor ...

  2. Cubieboard搭建Hadoop指南

    1.刷固件 出厂的Cubieboard是Android系统,需要Linux系统安装Hadoop,到此网址下载: http://dl.cubieboard.org/software/a20-cubiet ...

  3. Word 2013安裝字典

    不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 ...

  4. [Bash] Create nested folder in Bash

    We can create a single folder by doing: mkdir onefolder If we want to create nested folder we need t ...

  5. poj 1258 Agri-Net(Prim)(基础)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44487   Accepted: 18173 Descri ...

  6. ansible学习之--简单学习笔记1

    1.利用dm-crypt来创建加密文件系统.编写shell脚本(安装和卸载两个shell脚本) 2.编写ansible,playbook文件 3.编写python脚本 首先编写shell脚本 inst ...

  7. java实现从报文中获取投保单号

    java实现从报文中获取投保单号 投保单号正则表达式: String regex = "<proposalNo>([0-9]+)</proposalNo>[\\s\\ ...

  8. linux 【第五篇】特殊权限及定时任务

    特殊权限 [root@VM_141_154_centos ~]# ls -ld /tmp drwxrwxrwt. 8 root root 4096 Apr 5 08:11 /tmp /tmp/ 公共目 ...

  9. C ++模板的声明和实现为何要放在头文件中?

    源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 ...

  10. Entity Framework底层操作封装V2版本号(3)

    如今是附加的,组合查询须要的扩展类.大家知道lanmda表达式的组合条件比較麻烦,所以就加了一样一个类,方便进行组合查询: using System; using System.Collections ...