POJ 2010

POJ 2010

题目大意:

奶大招生,从C头里招N头,每头都有自己的成绩score_i和需要的补助金financial aid_i.学校一共有资金F发放。求满足招满N头牛,总共补助金不超过F的条件下

,求N头里最大的中位数。

贪心策略:

招N头,中间那个牛的成绩是重点,其它忽略不看。所以,按牛的成绩对牛进行排序,用lower[i]表示其它成绩低的N-1/2头牛的资金总和,higher[i]表示其它成绩

高的N-1/2头牛的总和,最后从后往前历遍,第一个满足lower[i]+score[i]+higher[i]<=F的成绩就是答案。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 using namespace std;
 5
 6 #define MAX_COW 100000 + 16
 7
 8 int N, C, F;
 9 pair<int, int> cow[MAX_COW];
10 // 牛i作为中位数时,lower[i]表示分数低于它的牛的学费总和
11 int lower[MAX_COW], upper[MAX_COW];
12
13 ///////////////////////////SubMain//////////////////////////////////
14 int main()
15 {
16     cin >> N >> C >> F;
17     int half = N / 2;
18     for (int i = 0; i < C; ++i)
19     {
20         cin >> cow[i].first >> cow[i].second;    // 分数 <-> 学费
21     }
22     sort(cow, cow + C);
23     {
24         int total = 0;
25         priority_queue<int> q;
26         for (int i = 0; i < C; ++i)
27         {
28             lower[i] = q.size() == half ? total : 0x3f3f3f3f;
29             q.push(cow[i].second);
30             total += cow[i].second;
31             if (q.size() > half)
32             {
33                 // 然后踢掉一个学费最高的家伙
34                 total -= q.top(); q.pop();
35             }
36         }
37     }
38
39     {
40         int total = 0;
41         priority_queue<int> q;
42         for (int i = C - 1; i >= 0; --i)
43         {
44             upper[i] = q.size() == half ? total : 0x3f3f3f3f;
45             q.push(cow[i].second);
46             total += cow[i].second;
47             //思考之后发现要用优先队列
48             if (q.size() > half)
49             {
50                 // 然后踢掉一个学费最高的家伙
51                 total -= q.top(); q.pop();
52             }
53         }
54     }
55
56     int result;
57     for (int i = C - 1; i >= 0; --i)
58     {
59         if (lower[i] + cow[i].second + upper[i] <= F)
60         {
61             result = cow[i].first;
62             break;
63         }
64     }
65
66     cout << result << endl;
67
68     return 0;
69 }
时间: 2024-08-07 14:50:18

POJ 2010的相关文章

POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速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( 优先队列+二分查找)

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

poj 2010 Moo University - Financial Aid 大顶堆维护最小和

题意: 有c有牛,从中选(n-1)/2头,使他们的得分中位数最大且需要的资金援助和不超过f. 分析: 堆的运用大顶堆维护最小和. 代码: //poj 2010 //sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std; const int maxN=100024; int dpl[maxN],dpr[maxN]; priority_queue<int&g

poj -2010 Moo University - Financial Aid (优先队列)

http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U"大学学费非常昂贵,并非每一头小牛都能支付的起,很多小牛都需要经济援助,但是学校只有有限的资金F. "Moo U"大学只会从C个学生里选N个学生出来,(N是奇数),但是希望N头小牛CSAT得分的中位数越高越好.输入N,C,F 接下来C行,每行包括一个得分和需要申请的经济援助,输出符合条件

poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)

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

POJ - 2010 Moo University - Financial Aid 贪心+优先队列

题目大意:有C头牛,每头牛都有相应的分数和需求,要求在这C头牛中选出N头,使得这N头牛中的分数的中位数达到最大,且需求之和小于等于F 解题思路:先按成绩排序 再用两个数组保留最小需求之和 left数组保留第i个位置左边的 N/2个最小需求之和 right数组保留第i个位置右边的 N/2个最小需求之和 如何保留最小的需求之和呢,扫描两遍(左右),用优先队列保留N / 2个最小需求 最后只需要判断一下 left[i] + right[i] + 第i头牛的需求 <= F就可以了 #include<c

POJ 2010 (优先队列

用优先队列扫一次得到大于和小于中位数的总和的最小值,再扫一遍得到最优解 #include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<utility> #include<vector> #define INF 0x3fffffff using namespace std; typedef long long ll; int N,C,F;

POJ 2010 Moo University - Financial Aid 堆的高级应用 -- 维护最小(最大和)

题目大意:有N头牛,每头牛两个权值,A和B.从这N头牛中选取C头牛,使得: 1.这些牛中A权值的中位数尽量大. 2.这些牛的B权值的和小于题中所给的F 输出这个最大的A权值的中位数:如果没有满足题意的解,就输出-1.值. 思路: 堆有一个神奇的功能.假设上图是一个数组,在B从A到C移动的过程中,利用大根堆可以维护出B在所有位置时,从A到B中选K个值的和的最小值,并在nlogn内得到答案. 方法如下:先把[A,A + K]的元素加入到一个大根堆中,记录它们的总和.之后让B不断向后循环,把B加入到大

Moo University - Financial Aid (poj 2010 优先队列 或者 二分)

Language: Default Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5551   Accepted: 1663 Description Bessie noted that although humans have many universities they can attend, cows have none. To remedy this p