堆 poj 2010
选n个人从c个中 花费不超过f
c个人的成绩和花费
求分数中位数最大 n是奇数
显然中位数是n/2+1 ~c-n/2之间的(假如存在的话)
用大顶堆维护前n/2个小的花费 求出以这个人为中位数的花费
同理求出后面n/2个人的最小花费
然后判断一下即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector> using namespace std;
#define MAXN 100010 struct cow
{
int l,r,sc,co;
}x[MAXN]; struct node//大顶堆
{
int Size;
int z[MAXN];
void clear()
{
Size=;
memset(z,,sizeof(z));
}
bool empty()
{
return Size?:;
}
void shift_up(int a)
{
while(a>)
{
if(z[a]>z[a>>])
{
swap(z[a],z[a>>]);
a=a>>;
}
else
break;
}
}
void shift_down(int a)
{
while((a<<)<=Size)
{
int b=a<<;
if(b<Size&&z[b]<z[b+])
b++;
if(z[a]<z[b])
{
swap(z[a],z[b]);
a=b;
}
else
break;
}
}
int top()
{
return z[];
}
void pop()
{
swap(z[],z[Size]);
Size--;
shift_down();
}
void push(int a)
{
z[++Size]=a;
shift_up(Size);
}
};
bool cmp(cow a,cow b)
{
return a.sc<b.sc;
} int main()
{
int n,c,f;
scanf("%d%d%d",&n,&c,&f);
for(int i=;i<=c;i++)
scanf("%d%d",&x[i].sc,&x[i].co);
sort(x+,x+c+,cmp);
node Q;
Q.clear();
int sum=; for(int i=;i<=n/;i++)
{
Q.push(x[i].co);
sum+=x[i].co;
}
for(int i=n/+;i<=c-n/;i++)
{
x[i].l=sum;
int q=Q.top();
int p=x[i].co;
if(p<q)
{
Q.pop();
sum=sum+p-q;
Q.push(p);
}
}
Q.clear();
sum=;
for(int i=c;i>c-n/;i--)
{
Q.push(x[i].co);
sum+=x[i].co;
}
for(int i=c-n/;i>=n/+;i--)
{
x[i].r=sum;
int q=Q.top();
int p=x[i].co;
if(p<q)
{
Q.pop();
sum=sum+p-q;
Q.push(p);
}
}
int i;
for(i=c-n/;i>=n/+;i--)
if(x[i].co+x[i].l+x[i].r<=f)
break;
if(i>=n/+)
printf("%d\n",x[i].sc);
else
printf("-1\n"); return ;
}
堆 poj 2010的更多相关文章
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...
- poj 2010 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(堆维护滑窗kth,二分)
按照score排序,贪心,从左到右用堆维护并且记录前面的最小N/2个花费之和. 然后从右向左枚举中位数,维护N/2个数之和加上并判断是否满足条件.(stl的队列没有clear(),只能一个一个pop. ...
- poj -2010 Moo University - Financial Aid (优先队列)
http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U&quo ...
- 【POJ 2010 Moo University-Financial Aid】优先级队列
题目链接:http://poj.org/problem?id=2010 题意:C只牛犊,各有自己的分数score和申请的补助aid,现要选出N只(N为奇数),使得其aid的总和不超过F,且按score ...
- poj 2010 Moo University - Financial Aid (贪心+线段树)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...
- Moo University - Financial Aid POJ 2010 优先队列(最大堆)
题目:http://poj.org/problem?id=2010 题目大意: 奶牛上大学.因为经济问题,每头奶牛都需要一定的补助需求,学校会提供一定的资金用于补助 每头牛都有自己的分数,学校招收的名 ...
- 堆 poj 2442
t组数据 n m 给 n*m的矩阵 从每行拿出一个数 可有n^m个组合 求前n小的输出 维护前n小的数组 #include<stdio.h> #include<string.h> ...
随机推荐
- URL和URI的区别和联系
URI:Universal Resource Identifier,通用资源标识符: URL:Uniform Resource Locator,统一资源定位符: 其中,URL ...
- Thread 同步线程(打印机同步)
1.首先创建一个打印机对象 package cn.b.happy; public class Printer { Object o =new Object(); public void print() ...
- AC日记——找最大数序列 openjudge 1.9 10
10:找最大数序列 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n行,每行不超过100个无符号整数,无符号数不超过4位.请输出最大整数以及最大整数所在的行号(行号从1开始). ...
- u3d单词学习plane
plane n.水平: 平面: 飞机: 木工刨
- guava常用操作
Jack47 我思故我在 Google Java编程库Guava介绍 本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含 ...
- 收集入侵Windows系统的证据
随着网络的不断扩大,网络安全更加会成为人们的一个焦点,同时也成为是否能进一步投入到更深更广领域的一个基石.当然网络的安全也是一个动态的概念,世界上没有绝对安全的网络,只有相对安全的网络.相对安全环境的 ...
- ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现
from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...
- Anyconnect的VPN环境部署(1)-OpenConnect server(ocserv)服务安装
打算在公司IDC机房部署一套VPN环境,经过考虑,最终决定采用Cisco下的开源技术AnyConnect.AnyConnect的优势有:1)长连接,待机不会断开:2)速度快,稳定性好:3)安全性好,全 ...
- [LINK]php的三种CLI常量:STDIN,STDOUT,STDERR
FROM : http://www.cnblogs.com/thinksasa/archive/2013/02/27/2935158.html PHP CLI(command line interfa ...
- sudo su权限案例
一 控制sudo: 允许执行所有命令,排除某几个命令(带参数) lanny ALL=(ALL) NOPASSWD:ALL, !/bin/su - root, !/usr/sbin/visudo 如果需 ...