POJ_2010 Moo University - Financial Aid 【堆预处理】
一、题面
二、分析
堆预处理
首先可以考虑吧随便取一个点,判断两侧的最小的总费用是多少,然后相加判断是否满足条件。如果直接判断会超时,所以需要用大根堆预处理一下。先看从分数最小的往最大的预处理,先取N/2个相加,并把他们都加入到堆中,先假设这个和值是最大的,然后不断往后扫描的过程中,不断更新大根堆的根值,以及它的和。反向预处理类似。比较容易出错的是选的范围,如果不用那些不可能到的点,可以随意点,但如果需要使用这些点,需要用足够大的值填充。
三、AC代码
#include <cstdio>
#include <algorithm>
#include <queue>
#include <fstream>
#include <iostream> using namespace std; const int MAXN = 1e5+;
int N, C, F, ans;
struct Node
{
int score, aid;
bool operator<(const Node t)const
{
return score < t.score;
}
}Calves[MAXN];
int Left[MAXN], Right[MAXN]; void solve()
{
priority_queue<int, vector<int>, less<int> > pql, pqr;
int i, temp, sum = ;
//正向扫描求最小和,保持大根堆的容量始终为N/2
for(i = ; i < N/; i++)
{
sum += Calves[i].aid;
Left[i] = ;
pql.push(Calves[i].aid);
}
for(i; i < C-N/; i++)
{
Left[i] = sum;
temp = pql.top();
if(Calves[i].aid < temp)
{
pql.pop();
sum -= temp;
sum += Calves[i].aid;
pql.push(Calves[i].aid);
}
} //反向扫描
sum = ;
for(i = C-; i > C-N/-; i--)
{
sum += Calves[i].aid;
Right[i] = ;
pqr.push(Calves[i].aid);
}
for(i; i >= N/; i--)
{
Right[i] = sum;
temp = pqr.top();
if(Calves[i].aid < temp)
{
pqr.pop();
sum -= temp;
sum += Calves[i].aid;
pqr.push(Calves[i].aid);
}
} } int main()
{
// freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
while(scanf("%d %d %d", &N, &C, &F)!=EOF)
{
bool flag = false;
for(int i = ; i < C; i++)
{
scanf("%d %d", &Calves[i].score, &Calves[i].aid);
}
sort(Calves, Calves+C);
solve();
for(int i = C-N/-; i >= N/; i--)
{
if(Right[i] + Left[i] + Calves[i].aid <= F)
{
printf("%d\n", Calves[i].score);
flag = true;
break;
}
}
if(!flag)
{
printf("-1\n");
}
}
return ;
}
POJ_2010 Moo University - Financial Aid 【堆预处理】的更多相关文章
- Divide and conquer:Moo University - Financial Aid(POJ 2010)
Moo University - Financial Aid 其实是老题了http://www.cnblogs.com/Philip-Tell-Truth/p/4926008.html 这一次我们换二 ...
- Moo University - Financial Aid
Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6020 Accep ...
- poj 2010 Moo University - Financial Aid
Moo Univ ...
- POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...
- 【POJ - 2010】Moo University - Financial Aid(优先队列)
Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...
- poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会
Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6599 A ...
- poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)
Description Bessie noted that although humans have many universities they can attend, cows have none ...
- poj2010 Moo University - Financial Aid 优先队列
Description Bessie noted that although humans have many universities they can attend, cows have none ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
随机推荐
- A Recipe for Training Neural Networks [中文翻译, part 1]
最近拜读大神Karpathy的经验之谈 A Recipe for Training Neural Networks https://karpathy.github.io/2019/04/25/rec ...
- Tensorflow CPU mask-rcnn 训练模型
基于cpu版的tensorflow ,使用mask_rcnn训练识别箱子的模型 代码参考(https://blog.csdn.net/disiwei1012/article/details/79928 ...
- 面试题:filter过滤器 listener 监听器 案例有点用
1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...
- solidity mapping of mapping
solidity mapping of mapping,两层映射,用的时候可以像二维数组一样去访问和修改值,非常方便. 以下代码示例中的这一句: mapping(string => mappin ...
- Linux tmux
一.简介 Tmux是一个用于终端复用的软件,它允许一个用户在一个终端窗口或远程终端会话中使用多个不同的终端会话.在同一个命令行接口处理多个程序,以及将程序从已经开始运行另外的程序的Unix shell ...
- linux删除文件后磁盘空间未释放的问题
很可能是该文件还被其它进程使用. 使用: lsof | grep deleted | grep $FILE_NAME 可以看到正使用该文件的进程,将之kill即可.也可以查看进程来验证: ls -l ...
- Django开发——集成的子框架django.contrib
Django开发——集成的子框架django.contrib 2018年09月11日 19:32:42 Mrkang1314 阅读数:63 https://blog.csdn.net/mashaok ...
- Flask框架 之 wtforms
简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 作用 生成HTML标签 form表单验证 使用 - 用户登录示例- 用户注册示例- 数据库获取数据实时更新 ...
- codefirst updatebase
http://blog.csdn.net/dj2008/article/details/23756895 http://blog.csdn.net/gentle_wolf/article/detail ...
- IIS身份验证知识摘录
IIS 身份验证 ASP.NET 身份验证分为两个步骤.首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户.IIS 通过查看 IIS 元数据 ...