堆 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 MA…
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O(1)找到最大/最小值,并能持续维护. 复杂度 push() = O(logn); pop() = O(logn); BinaryHeap() = O(nlogn); 实现 数组下标从1开始的情况下,有 Parent(i) = i >> 1 LChild(i) = i << 1 RChi…
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在,则输出-1(一开始因为没看见这个,wa了几次). 这个题的第一种做法就是用两个优先队列+贪心. /* * Created: 2016年03月27日 14时41分47秒 星期日 * Author: Akrusher * */ #include <cstdio> #include <cstdl…
Description Bessie noted that although humans have many universities they can attend, cows have none. To remedy this problem, she and her fellow cows formed a new university called The University of Wisconsin-Farmside,"Moo U" for short. Not wish…
按照score排序,贪心,从左到右用堆维护并且记录前面的最小N/2个花费之和. 然后从右向左枚举中位数,维护N/2个数之和加上并判断是否满足条件.(stl的队列没有clear(),只能一个一个pop... 复杂度O(nlogn) 也可以二分.先按照score排序,记录备份牛在排序后的下标.然后将备份按照资金排序, ,二分中位数的值,对于mid值,按照备份顺序贪心选择牛,根据之前的下标判断在左边或者右边. 因为是最贪心的选,如果两边都不够,说明无解.如果某一边少了,mid就应该往相反的方向移动.…
http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U"大学学费非常昂贵,并非每一头小牛都能支付的起,很多小牛都需要经济援助,但是学校只有有限的资金F. "Moo U"大学只会从C个学生里选N个学生出来,(N是奇数),但是希望N头小牛CSAT得分的中位数越高越好.输入N,C,F 接下来C行,每行包括一个得分和需要申请的经济援助,输出符合条件…
题目链接:http://poj.org/problem?id=2010 题意:C只牛犊,各有自己的分数score和申请的补助aid,现要选出N只(N为奇数),使得其aid的总和不超过F,且按score排序后中位数最大. 数据范围:N [1, 19999],  C [N, 10^5], aid [0, 10^5], F, score不超过int的最大值 思路: 1. 先将C只牛按score从小到大排序,得到序列 s,这样顺序抽取出N只构成的序列 t 必然是 s 的子序列. 中位数特殊的地方在于它在…
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个,使得总花费小于等于f,保证价值的中位数最大 http://poj.org/problem?id=2010 做法:按价值排序之后,枚举中位数,然后对于小于中位数的部分贪心选出花费最小的n/2个,大于的部分也贪心选出花费最小的n/2个,然后比较总花费与f的关系. 可以用两个线段树维护一下,左部分便是每…
题目:http://poj.org/problem?id=2010 题目大意: 奶牛上大学.因为经济问题,每头奶牛都需要一定的补助需求,学校会提供一定的资金用于补助 每头牛都有自己的分数,学校招收的名额也是有限的 题目要求是在录取名额和总补助资金确定的情况下,使得录取学生的成绩的中位数达到最大,问最大的中位数? 思路: 先按分数排个序,从左到右遍历一遍,记录当前位置之前的( 名额数/2 )头奶牛所需的最小补助金额 从右往左遍历一遍,记录当前位置之后的( 名额数/2 )头奶牛所需的最小补助金额.…
t组数据 n m 给 n*m的矩阵 从每行拿出一个数 可有n^m个组合 求前n小的输出 维护前n小的数组 #include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; #define MAXN 100010 struct node//手写个堆 大顶堆 { int Size; int z[MAXN]; void clear() { S…