题意:
奶大招生,从C头奶牛中招收N头。
它们分别得分cast,需要资助学费aid。
希望新生所需资助不超过F,同时得分中位数最高。求此中位数。
解析;
贪心。先取费用最小的 n / 2 头牛,然后用剩下的最多的钱来收买高分学生。
收买高分学生用优先队列来维护,分数低的为小顶,若分数低,又耗钱多,就踢出队列。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
struct Node
{
int cast, aid;
bool operator < (const Node &a) const
{
return cast > a.cast;
}
} a[maxn];
bool cmp(Node a, Node b)
{
return a.aid < b.aid;
}
int n, c, f;
int ans[maxn];
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
while (~scanf("%d%d%d", &n, &c, &f))
{
for (int i = 0; i < c; i++)
{
scanf("%d%d", &a[i].cast, &a[i].aid);
}
sort(a, a + c, cmp);
LL sum = 0;
for (int i = 0; i < n; i++)
{
sum += a[i].aid;
}
if (sum > f)
{
printf("-1\n");
}
else
{
int cnt = 0;
priority_queue<Node> q;
for (int i = 0; i < n / 2; i++)
{
ans[cnt++] = a[i].cast;
f -= a[i].aid;
}
for (int i = n / 2; i < n; i++)
{
q.push(a[i]);
f -= a[i].aid;
}
for (int i = n; i < c; i++)
{
Node now = q.top();
int aid = now.aid;
int cast = now.cast;
if (a[i].aid <= aid + f && cast < a[i].cast)
{
q.pop();
f = f + aid - a[i].aid;
q.push(a[i]);
}
}
while (!q.empty())
{
ans[cnt++] = q.top().cast;
q.pop();
}
sort(ans, ans + cnt);
printf("%d\n", ans[n >> 1]);
}
}
return 0;
}