Moo University – Financial Aid 财政补助
— 题目来源:[Usaco2004 Feb]
描述:
贝茜统计到人类拥有很多大学可以去就读,而奶牛们却一个大学也没有.
为了解决这个问题,她和她的同伴们建立了一所奶牛大学Moo大学.
为了防止笨牛入学,学校的创立者搞了一个奶牛智力测试(CSAT),它的分数在区间[1,2×10^9]内.
Moo大学的学费很昂贵:不是所有奶牛都能负担.
事实上,大多数奶牛需要一些财政帮助a(0≤o≤100000).政府不会给奶牛任何资金,所以所有的资金都来自于学校有限的资金,资金总数为F(0≤F≤2×10^9).更糟的是,虽然有C(N≤C≤100000)头奶牛报考,Moo大学却只能接受N(1≤N≤19999)头奶牛,N为奇数.
贝茜既要让这N头奶牛享受最大限度的教育资源,又要它们CSAT分数的中位数尽可能高. 这里说一下对于一个奇数个数组成的集合中中位数的概念.例如,集合3,8,9,7,5的中位数是7,因为有两个数小于7,有两个数大于7.
给出每头奶牛的分数和所需的财政补贴数,可以接纳的奶牛数,补助的资金总数,求出中位数最大的可能值.
(1)我们可以分别假设每一个数是中位数,即将成绩从大到小排序,从前往后遍历。
(2)因此,左右各选牛的个数为(mid+1)/2(mid+1)/2(mid+1)/2,并使其和最小
(3)降低复杂度,选择队列维护左,右,选(mid+1/2)(mid+1/2)(mid+1/2)头牛花费最小值
复杂度O(nlog2n)O(n\log_{2}{n})O(nlog2n)
以下是代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
/*
inline char gc(){
static char now[1<<16],*T,*S;
if(T==S){T=(S=now)+fread(now,1,1<<16,stdin);if(T==S)return EOF;}
return*S++;
}
inline int read(){
register char ch=gc();
while((ch<'0'||ch>'9')&&ch!='-')ch=gc();
register bool neg=ch=='-';
register int in=neg?0:ch-'0';ch=gc();
while(ch>='0'&&ch<='9')in=(in<<3)+(in<<1)+ch-'0',ch=gc();
return neg?-in:in;
}
*/
inline int read(){
register char ch=</