poj2010
大学招n(n为奇数)个牛 招第i个牛需要ai块钱 第i个牛高考si分
输入招的牛数n 总的牛数c 总的钱数f
以及ai si
问用这些钱招的n个牛高考分数的中位数最大是多少
如果钱不够输出-1
这题结果只与中间那个牛的分数有关
设k=(n+1)/2
则可以得到分比k低的招了(n-1)/2个
比k高的也招了(n-1)/2个
用dpL[i]表示在[1,i]中招(n-1)/2个的最小花费
用dpR[i]表示在[i,c]中招(n-1)/2个的最小花费
排序 枚举k
如果满足dpL[i] + dpR[i] + ai <= F就可行
在可行情况下找最大的中位数就可以了
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=;
int dpl[N],dpr[N];
priority_queue<int> Q;
struct Data
{
int s,f;
}cow[N];
bool comp(Data a,Data b)
{
if(a.s!=b.s)
return a.s>b.s;
else
return a.f<b.f;
}
int main()
{
int n,c,f;
while(scanf("%d%d%d",&n,&c,&f)!=EOF)
{
int nu=(n-)/;
for(int i=;i<=c;i++)
scanf("%d%d",&cow[i].s,&cow[i].f);
sort(cow+,cow+c+,comp);
while(!Q.empty())
Q.pop();
int sum=;
for(int i=;i<=nu;i++)
Q.push(cow[i].f),sum+=cow[i].f;
dpl[nu]=sum;
for(int i=nu+;i<=c;i++)
{
if(cow[i].f>=Q.top())
dpl[i]=sum;
else
{
sum=sum-Q.top()+cow[i].f;
Q.pop();
Q.push(cow[i].f);
dpl[i]=sum;
}
}
sum=;
while(!Q.empty())
Q.pop();
for(int i=c;i>=c-nu+;i--)
Q.push(cow[i].f),sum+=cow[i].f;
dpr[c-nu+]=sum;
for(int i=c-nu;i>=;i--)
{
if(cow[i].f>=Q.top())
dpr[i]=sum;
else
{
sum=sum-Q.top()+cow[i].f;
Q.pop();
Q.push(cow[i].f);
dpr[i]=sum;
}
}
bool flag=false;
for(int i=nu+;i<=c-nu;i++)
{
if(cow[i].f+dpl[i-]+dpr[i+]<=f)
{
flag=true;
printf("%d\n",cow[i].s);
break;
}
}
if(!flag)
printf("-1\n");
}
return ;
}
poj2010的更多相关文章
- POJ2010 Moo University - Financial Aid(二分法)
题目地址 分析:如果用二分法,关键是score和aid分开排序,score排序是为了充分利用中位数的性质,这样就可以确定m左右必须各选N/2个,到这之后有人是用dp求最优解,可以再次按照aid排序一次 ...
- Moo University - Financial Aid [POJ2010] [堆]
题意: 在C头牛里选N头牛,每头牛需要花掉一定经费ai才能得到一定得bi分,在不超过经费F的情况下,使得N头牛的得分中位数最大.(1 <= N <= 19,999,奇数) (N <= ...
- Poj2010 Moo University - Financial Aid
题意的话,就看其他人的吧 概括:二分中位数 大体上便是二分一个中位数,带入检验,若分数比他小的有\(\lfloor n/2 \rfloor\)个,分数比他的大的也有这么多,而且贪心的买,花费小于预算. ...
- poj2010 Moo University - Financial Aid 优先队列
Description Bessie noted that although humans have many universities they can attend, cows have none ...
- poj3月题解
poj2110 二分答案+bfs判定 poj2112 二分答案+最大流判定(二分答案真乃USACO亲儿子) poj1986 裸的LCA,值得注意的是,树中任意两点的距离可以等于这两点到根的距离减去2* ...
- OJ题目分类
POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...
- POJ_2010 Moo University - Financial Aid 【堆预处理】
一.题面 POJ2010 二.分析 堆预处理 首先可以考虑吧随便取一个点,判断两侧的最小的总费用是多少,然后相加判断是否满足条件.如果直接判断会超时,所以需要用大根堆预处理一下.先看从分数最小的往最大 ...
- 【POJ - 2010】Moo University - Financial Aid(优先队列)
Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...
随机推荐
- django admin基础
通过onetoonefiled扩展得到的不会在添加user是自动添加原因是onetoonefiled只是一个model 可以they are just Django models that happe ...
- hibernate 操作 Postgresql 数据库报 operator does not exist: integer = character varying
网上的说法如下: Java开发Postgresql 数据库兼容应用的问题,与Oracle有一些不同: Java类型映射数据库类型的不同,Oracle jdbc驱动程序处理Java String类型可正 ...
- javaweb学习纲要
Java Web 概述 大纲: 1.C/S体系结构 2.B/S体系机构 3.两种体系结构比较 4.主流的Web程序应用平台 5.java web学习路线图 1.C/S体系结构 C/S是Client/ ...
- Loadrunder之脚本篇——参数化在场景中的运用
Action() { lr_eval_string("{NewParam}"); lr_eval_string("{NewParam}"); return 0; ...
- facebook开源了他们的分布式大数据DB
https://github.com/facebook/presto facebook 3天前开源了他们的 分布式大数据DB Distributed SQL query engine for big ...
- Linux安装jdk10
1.官网下载jdk10 下载方式两种,一种是wget下载,一种是windows系统下载,然后上传到linux系统上. 2.解压到/usr/local/java mkdir /usr/local/jav ...
- OpenCV图片拼接的两种方法
https://my.oschina.net/xiaot99/blog/226589 一.原图 1.jpg 2.jpg ...
- awk遇到windows 的^M
windows在编辑的文档,在linux中显示会在行尾出现一个^M window下编辑的文档:末尾带^M$ linux下编辑的文档:末尾带$ awk中如果存在^M,则会限制print的输出列数(只能输 ...
- PreTranslateMessage作用和使用方法
PreTranslateMessage作用和使用方法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用, ...
- INSPIRED启示录 读书笔记 - 第1章 关键角色及其职责
现代软件产品团队 1.产品经理的主要职责分为两项:评估产品机会和定义要开发的产品 2.用户体验设计师(由多种角色组成,这里面最关键的是交互设计师) 交互设计师负责深入理解目标用户,设计有价值 ...