题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1.

思路:首先对n头牛按分数进行排序,然后假设当前这头牛X的分数为中位数,然后求出X前面n/2头牛的最小花费和,以及后面n/2头牛的最小花费和。

   因为按分数排序,X的前n/2和后n/2的牛的分数肯定分别大于等于X和小于等于X,所以X的分数肯定会是中位数。

   所以,我们令left[i]为牛i的前n/2头牛的最小花费和,right[i]为牛i的后n/2头牛的最小花费和,然后i从c-1到0遍历,求出第一个头牛的left[i]+right[i]+X的花费 ≤ f,该头牛的分数就是所求出的最大中位数。

AC代码:

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX_N = 100005;
int n,c,f, left[MAX_N], right[MAX_N], half,total,result;
pair<int, int> w[MAX_N];
void solve()
{
half = n/2;
total = 0; priority_queue<int> q;
for(int i = 0; i < c; i++)
{
left[i] = q.size() == half ? total : 0x3f3f3f3f;
q.push(w[i].second);
total += w[i].second; if(q.size() > half)
{
total -= q.top();
q.pop();
}
} total = 0;
while(!q.empty()) q.pop();
for(int i = c-1; i >= 0; i--)
{
right[i] = q.size() == half ? total : 0x3f3f3f3f;
q.push(w[i].second);
total += w[i].second;
if(q.size() > half)
{
total -= q.top();
q.pop();
}
} result = -1;
for(int i = c-1; i >= 0; i--)
{
int x = left[i] + w[i].second + right[i];
if(x <= f)
{
result = w[i].first;
break;
}
}
printf("%d\n", result);
}
int main()
{
scanf("%d %d %d", &n, &c, &f);
for(int i = 0; i < c; i++)
scanf("%d %d", &w[i].first, &w[i].second);
sort(w,w+c);
solve();
return 0;
}

  

POJ 2010 Moo University - Financial Aid 优先队列的更多相关文章

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

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

  2. poj -2010 Moo University - Financial Aid (优先队列)

    http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U&quo ...

  3. poj 2010 Moo University - Financial Aid

                                                                                                Moo Univ ...

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

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

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

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

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

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

  7. POJ 2010 Moo University - Financial Aid (优先队列)

    题意:从C头奶牛中招收N(奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 思路: 先将奶牛排序,考虑每个奶牛作为中位数时,比它 ...

  8. poj 2010 Moo University - Financial Aid (贪心+线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...

  9. POJ 2010 Moo University - Financial Aid treap

    按第一关键字排序后枚举中位数,就变成了判断“左边前K小的和 + 这个中位数 + 右边前K小的和 <= F",其中维护前K小和可以用treap做到. #include <cstdi ...

随机推荐

  1. dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)

    <?php class DBDA { public $host = "localhost"; public $uid = "root"; public $ ...

  2. VS2012/2013编辑器问题

    1. Visual Studio 2013 'Could not evaluate Expression' Debugger Abnormality 解决办法:http://weblog.west-w ...

  3. JavaScript 中的事件设计

    1. 事件绑定的几种方式  主要介绍一下 最常用的事件设计 其他就稍微带过. 直接在代码里面添加onclick指定函数名字. B) 在JS代码中通过dom元素的onclick等属性 这种做法this表 ...

  4. Javascript进阶篇——(DOM—节点---获取浏览器窗口可视区域大小+获取网页尺寸)—笔记整理

    浏览器窗口可视区域大小获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:一.对于IE9+.Chrome.Firefox.Opera 以及 Safari: • window.innerH ...

  5. js调用百度地图搜索功能

    引用百度jsApi <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&a ...

  6. AVL树插入和删除

    一.AVL树简介 AVL树是一种平衡的二叉查找树. 平衡二叉树(AVL 树)是一棵空树,或者是具有下列性质的二叉排序树:    1它的左子树和右子树都是平衡二叉树,    2且左子树和右子树高度之差的 ...

  7. 查看Sql语句执行速度

    原文链接:http://www.cnblogs.com/New-world/archive/2012/11/28/2793560.htmlMS_SQL模糊查询like和charindex的对比 lik ...

  8. WARNING: The following packages cannot be authenticated! foo bar baz Install these packages without verification [y/N]?

    apt-get install debian-archive-keyring apt-get update

  9. win32系统信息获取

    #include <Windows.h> #include "resource.h" #include <strsafe.h> PTSTR BigNumTo ...

  10. [翻译] C++ STL容器参考手册 (总册)

    1. 写在最前面 这将是博主的第一篇技术博客,思考再三决定从翻译开始.这将是一个系列的博客,由不同的章节组成,章节之间由超链接联系,开发过程将使用增量式开发,每次完成一个章节.本篇是本系列的总册,提供 ...