码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2010

时间:2015-10-23 13:16:06      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

POJ 2010

标签:

原文地址:http://www.cnblogs.com/xlsryj/p/4904118.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!