大学招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. Python之异常处理(Day27)

    一.错误和异常 part1: 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def test: pass #语法错 ...

  2. Python之------初识面向对象(Day22)

    一.面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序 ...

  3. django 操作前端数据

    django 利用json处理前端页面数据,FLASK当中也同样   def create_company(request):if request.user.is_superuser:custom_l ...

  4. XP、win7下Excel 2007多窗口打开Excel的解决方法

    http://blog.x6x8.com/?p=330 Win7下的方法(借鉴了XP的方法): 1.先在桌面先建一个txt文件,将下面的代码复制进去 32位WIN7复制下面一行start “Excel ...

  5. Apache NiFi 开发 安装说明

    系统环境: vmware安装的centos6.7虚拟机 jdk1.8版本 maven库3.3.9版本(在使用源码编译启动的时候需要修改配置文件与当前使用的maven版本匹配,最低使用版本好像是3.1. ...

  6. Springboot文件下载

    https://blog.csdn.net/stubbornness1219/article/details/72356632 Springboot对资源的描述提供了相应的接口,其主要实现类有Clas ...

  7. String和StringBufffer的区别

    string的字符串操作都是废弃已有的对象,开辟一个新的内存空间创建一个新的对象 比如一个string str= "字符串"; str += "a"; 这样的操 ...

  8. 【Head First Servlets and JSP】笔记5:HttpServletResponse resp

    [HttpServletResponse resp] [由servlet处理响应] 1.一般可以用通过resp获得一个输出流(writer),然后通过输出流将HTML写入响应.例如: resp.set ...

  9. [POI2009]Slw

    题目 神题!!只有\(POI\)出得出来的神题!! 只能说好像懂了,不想听蒟蒻废话就右转\(dalao\)的博客 目前网上除官方外仅三篇题解,由于推论无法直观得出且有点复杂,难免不好理解,手玩数据最重 ...

  10. Flume+Kafka+storm的连接整合

    Flume-ng Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume的文档可以看http://flume.apache.org/FlumeUserGuide.html ...