大学招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的更多相关文章

  1. POJ2010 Moo University - Financial Aid(二分法)

    题目地址 分析:如果用二分法,关键是score和aid分开排序,score排序是为了充分利用中位数的性质,这样就可以确定m左右必须各选N/2个,到这之后有人是用dp求最优解,可以再次按照aid排序一次 ...

  2. Moo University - Financial Aid [POJ2010] [堆]

    题意: 在C头牛里选N头牛,每头牛需要花掉一定经费ai才能得到一定得bi分,在不超过经费F的情况下,使得N头牛的得分中位数最大.(1 <= N <= 19,999,奇数) (N <= ...

  3. Poj2010 Moo University - Financial Aid

    题意的话,就看其他人的吧 概括:二分中位数 大体上便是二分一个中位数,带入检验,若分数比他小的有\(\lfloor n/2 \rfloor\)个,分数比他的大的也有这么多,而且贪心的买,花费小于预算. ...

  4. poj2010 Moo University - Financial Aid 优先队列

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

  5. poj3月题解

    poj2110 二分答案+bfs判定 poj2112 二分答案+最大流判定(二分答案真乃USACO亲儿子) poj1986 裸的LCA,值得注意的是,树中任意两点的距离可以等于这两点到根的距离减去2* ...

  6. OJ题目分类

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...

  7. POJ_2010 Moo University - Financial Aid 【堆预处理】

    一.题面 POJ2010 二.分析 堆预处理 首先可以考虑吧随便取一个点,判断两侧的最小的总费用是多少,然后相加判断是否满足条件.如果直接判断会超时,所以需要用大根堆预处理一下.先看从分数最小的往最大 ...

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

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

随机推荐

  1. MySQL数据库(4)_MySQL数据库外键约束、表查询

    一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

  2. 跟踪 twisted 里deferred 的Callback

    twisted 提供了 deferred 机制,而关键点就是回调.通过查看deferred 源码 (version 8.2.0)我们可以 看到 deferred的addCallback是怎么工作的,以 ...

  3. keepalived nginx 主备配置

    keepalived  nginx 主备配置(多主多备同理) 1.Nginx服务安装 nginx 不区分主备,在两台服务上安装两个即可. 安装参考:https://www.cnblogs.com/zw ...

  4. Linux Shell编程 sort、wc命令

    sort命令:字符串排序 sort 命令可以依据不同的数据类型来进行排序.sort 将文件的每一行作为一个单位,相互比较.比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将它们按升序输出 ...

  5. 九度oj-题目1103:二次方程计算器

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2799 解决:633 题目描述: 设计一个二次方程计算器 输入: 每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式. 输 ...

  6. MySQL/MariaDB数据库备份与恢复之mysqlpump入门操作

    创建测试用表:MariaDB [music]>  create table summary(id int,info char(128));Query OK, 0 rows affected (0 ...

  7. freemarker空值的处理

    FreeMarker的变量必须赋值,否则就会抛出异常.而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值.FreeMarker提供两个运算 ...

  8. SecureCRT按退格键出现^H问题

    1.  选择选项>>会话选项>>终端>>映射键

  9. Springmvc跳转路径

    forward转发地址栏不发生变化,redirect跳转地址栏变化,forward能把request域中的参数带给下一个,而redirect不会带过去,但是Springmvc的model虽然是基于re ...

  10. shell 计算文件交并差

    交集 $ sort a b | uniq -d 并集 $ sort a b | uniq 差集a-b $ sort a b b | uniq -u 文件乱序 cat tmp.txt | awk 'BE ...