标签:
题目大意:
奶大招生,从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 }
标签:
原文地址:http://www.cnblogs.com/xlsryj/p/4904118.html