zoukankan      html  css  js  c++  java
  • POJ 2010 Moo University

    题意:从C头奶牛中招收N(奇数)头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此中位数。

    思路:

    先将奶牛排序,考虑每个奶牛作为中位数时,比它分数低(前面的)的那群牛的学费总和lower_i,后面的总和upper_i。然后从分数高往分数低扫描,满足aid_i + lower_i + upper_i <= F的第一个解就是最优解

    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define MAX_COW 100000 + 16
    
    int N, C, F;
    pair<int, int> cow[MAX_COW];
    // 牛i作为中位数时,lower[i]表示分数低于它的牛的学费总和,upper[i]表示分数高于它的牛的学费总和
    int lower[MAX_COW], upper[MAX_COW];
    
    int main()
    {
    	cin >> N >> C >> F;
    	int half = N / 2;
    	for (int i = 0; i < C; ++i)
    	{
    		cin >> cow[i].first >> cow[i].second;	// 分数  学费
    	}
    	sort(cow, cow + C);
    	{
    		int total = 0;
    		priority_queue<int> q;
    		for (int i = 0; i < C; ++i)
    		{
    			lower[i] = q.size() == half ? total : 0x3f3f3f3f;
    			q.push(cow[i].second);
    			total += cow[i].second;
    			if (q.size() > half)
    			{
    				// 踢掉一个学费最高的
    				total -= q.top(); q.pop();
    			}
    		}
    	}
    
    	{
    		int total = 0;
    		priority_queue<int> q;
    		for (int i = C - 1; i >= 0; --i)
    		{
    			upper[i] = q.size() == half ? total : 0x3f3f3f3f;
    			q.push(cow[i].second);
    			total += cow[i].second;
    			if (q.size() > half)
    			{
    				// 踢掉一个学费最高的
    				total -= q.top(); q.pop();
    			}
    		}
    	}
    
    	int result;
    	for (int i = C - 1; i >= 0; --i)
    	{
    		if (lower[i] + cow[i].second + upper[i] <= F)
    		{
    			result = cow[i].first;
    			break;
    		}
    	}
    	cout << result << endl;
    	return 0;
    }
  • 相关阅读:
    [引]Windows Server 2003 : 服务器群集
    周国平:(爱情)永远未完成
    企业管理常用缩写术语之中英文对照表(含解释)
    微软相关中文网站
    陈安之:NAC神经链调正术
    学会不要再争吵
    Oracle基础学习四:字符串 数字 日期 等 相关函数
    贪多嚼不烂
    frameset 框架传值点滴
    陈安之成功的十个关键
  • 原文地址:https://www.cnblogs.com/demian/p/7376111.html
Copyright © 2011-2022 走看看