题目: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. iOS二维码扫描的实现(Swift)

    随着二维码的普遍使用,二维码扫描也成为了很多app的一个基本功能,本篇主要来介绍一下如何实现一个简单的二维码扫描功能.本文使用了XCode自带的AVFoundation 库,利用Swfit语言实现. ...

  2. 样式缩写——css技巧(一)

    一.margin和padding缩写 例: .sample-margin1{ margin-top:15px; margin-right:20px; margin-bottom:12px; margi ...

  3. 20155307 2016-2017-2 《Java程序设计》第七周学习总结

    学号 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 认识Lambda语法,方法参考在重用现有API上扮演了重要角色,重用现有方法操作,可避免到处写下Lamb ...

  4. 【leetcode 简单】 第八十八题 猜数字大小

    我们正在玩一个猜数字游戏. 游戏规则如下: 我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字. 每次你猜错了,我会告诉你这个数字是大了还是小了. 你调用一个预先定义好的接口 guess(in ...

  5. 正则表达式入门之学习路线&七个问题

    由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用: 最全的常用正则表达式大全——包括 ...

  6. AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision

    题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...

  7. KDE下安装fcitx后终端不能输入中文

    编辑用户的  ~/.profile 文件(或/etc/profile): #fcitx export XIM_PROGRAM=fcitx export XIM=fcitx export GTK_IM_ ...

  8. discuz过滤词语无效

    1.是由于一些特殊的字导致serialize序列化错误.过滤词语在表 common_word中,序列化房子common_syscache的censor中,看看是否有特殊符号.

  9. 64_t7

    texlive-ulqda-bin-svn13663.0-33.20160520.fc26.2..> 24-May-2017 15:57 33102 texlive-ulqda-doc-svn2 ...

  10. R语言以及RStdio的安装

    R语言: 首先从官网上下载R安装包, 提供了Linux, (Mac) OS X, Windows的安装包相关下载链接. RStdio: RStdio(官网)是R言语非常实用的IDE, 是一个免费的软件 ...