题目:http://poj.org/problem?id=2010

题目大意:

奶牛上大学。因为经济问题,每头奶牛都需要一定的补助需求,学校会提供一定的资金用于补助

每头牛都有自己的分数,学校招收的名额也是有限的

题目要求是在录取名额和总补助资金确定的情况下,使得录取学生的成绩的中位数达到最大,问最大的中位数?

思路:

先按分数排个序,从左到右遍历一遍,记录当前位置之前的( 名额数/2 )头奶牛所需的最小补助金额

从右往左遍历一遍,记录当前位置之后的( 名额数/2 )头奶牛所需的最小补助金额。

从后往前走,从(总数-1-名额数/2)地方开始,如果当前补助+前面遍历得到的两个之和不大于总补助金额,那么该位置的分数即为最大中位数。

中间记录时候会进行查找替换,所以选用优先级队列更高效。

比如总共有12头牛,需要5头,那么经过排序以及两次遍历之后,每个位置多出两个量,一个是当前位置之前选出的两头奶牛所需的最小的补助需求金额,另一个量是从当前位置之后选出的两头奶牛所需的最小补助金额。

然后从第10头牛向左遍历,如果当前牛所需的补助加上两个量不大于总补助,那么当前牛的分数即为答案。

代码如下:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int MAX = ; class Node
{
public:
long score, aid;
Node(const int a = ,const int b = ):score(a),aid(b){ }
bool operator<(const Node& rhs)const
{
return this->aid < rhs.aid;
}
}; bool my_cmp(const Node&lhs, const Node&rhs)
{
return lhs.score < rhs.score;
} Node list[MAX];
long mark1[MAX], mark2[MAX]; int main()
{
long N, C, F;
scanf("%ld %ld %ld", &N, &C, &F);
priority_queue<Node> Q1, Q2;
int standard = N / , S1 = , S2 = ; for (int i = ; i < C; i++)
scanf("%ld %ld", &list[i].score, &list[i].aid); sort(list, list + C, my_cmp); for (int i = ; i < C; ++i)
{
if (i < standard)
{
Q1.push(list[i]);
S1 += list[i].aid;
continue;
}
mark1[i] = S1;
if (list[i].aid >= Q1.top().aid)continue;
S1 -= Q1.top().aid;
Q1.pop();
Q1.push(list[i]);
S1 += list[i].aid;
} for (int i = C - ; i >= ; --i)
{
if (i > C - - standard)
{
Q2.push(list[i]);
S2 += list[i].aid;
continue;
}
mark2[i] = S2;
if (list[i].aid >= Q2.top().aid)continue;
S2 -= Q2.top().aid;
Q2.pop();
Q2.push(list[i]);
S2 += list[i].aid;
}
int result = -;
for (int i = C - - standard; i >= standard; i--)
if (mark1[i] + mark2[i] + list[i].aid <= F && (result = list[i].score))break;
printf("%d\n", result);
return ;
}

感谢您的阅读,生活愉快~

Moo University - Financial Aid POJ 2010 优先队列(最大堆)的更多相关文章

  1. Divide and conquer:Moo University - Financial Aid(POJ 2010)

    Moo University - Financial Aid 其实是老题了http://www.cnblogs.com/Philip-Tell-Truth/p/4926008.html 这一次我们换二 ...

  2. Heap:Moo University - Financial Aid(POJ 2010)

       牛的学校 题目大意:这只Bessie真是太顽皮了,她又搞了个学校,准备招生,准备通过一个考试筛选考生,但是不能招到每个学生,每个学生也不能一定能上学,要资助,问你在一定资金内,怎么收学生,使收到 ...

  3. POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)

    POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...

  4. 【POJ - 2010】Moo University - Financial Aid(优先队列)

    Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...

  5. poj 2010 Moo University - Financial Aid

                                                                                                Moo Univ ...

  6. poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会

    Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6599   A ...

  7. Moo University - Financial Aid

    Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6020 Accep ...

  8. poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)

    Description Bessie noted that although humans have many universities they can attend, cows have none ...

  9. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

随机推荐

  1. 20155210潘滢昊 2016-2017-2 《Java程序设计》第5周学习总结

    20155210 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 try with resources 关闭多个资源时用分号分隔 java.lang.Auto ...

  2. CentOS7最小化安装之后无法联网以及无法使用ifconfig以及无法使用yum安装软件

    无法联网解决办法,CentOS-7默认网卡未激活,进入BOOS设置修改,或者直接修改配置文件,然后重启服务 1 修改网卡配置文件: 激活: 2 重启服务即可: service network rest ...

  3. Once you eliminate all the other factors,the only thing remaining must be the truth.

    Once you eliminate all the other factors,the only thing remaining must be the truth. 一旦你排除了杂因,剩下的一定是 ...

  4. Wannacry样本取证特征与清除

    一.取证特征 1)网络域名特征 http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 2)文件特征 母体文件 mssecsvc.exe c: ...

  5. MongoDB安全:所有操作(Privilege Actions)

    本文展示了两张思维导图,分别是MongoDB 3.6.4.0的所有权限操作,未做深入研究,仅仅是列出来. 3.6总共9类105个操作,4.0版本比3.6多了两类操作,同时增加了3个操作,共11类108 ...

  6. 基于timestamp和nonce的防止重放攻击方案

    参考:http://blog.csdn.net/koastal/article/details/53456696

  7. 洛谷P3396哈希冲突

    传送门啦 非常神奇的分块大法. 这个题一看数据范围,觉得不小,但是如果我们以 $ \sqrt(x) $ 为界限,数据范围就降到了 $ x < 400 $ 我们设数组 $ f[i][j] $ 表示 ...

  8. JS Ajax异步请求发送列表数据后面多了[]

    还在苦逼的写代码,这里就不详细了,直接抛出问题: 如图所示: 前端ajax请求向后端发送数据的时候,给key添加了[]出现很多找不到原因, 后面在说 解决方法: 暂时先这样记录一下,下次方便查找,好了 ...

  9. MySQL学习笔记:insert into select

    从一个表复制数据插入到另外一个表,目标表中任何已存在的行都不会受影响. 语法: INSERT INTO table_xxx VALUES(); INSERT INTO table_xxx SELECT ...

  10. 用户说体验 | 关于阿里百川HotFix你需要了解的一些细节

    最近很火的热修复技术,无意中了解到阿里百川也在做,而且Android.iOS两端都支持,所以决定试一试.试用一段时间后,感觉还不错,主要是他们有一个团队在不断维护更新这个产品,可以看到他们的版本更新记 ...