G - Moo University - Financial Aid
1.题目含义:
奶牛学校招生,c头奶牛报名,要选n头(n为奇数),学校是义务制,所以每头奶牛的学费都由学校负责。每头奶牛都由自己的考试分数和它需要花的学费,学校总共有f的资金,问合法招生方案中中间分数(即排名第(n+1)/2)最高的是多少。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
ll N,C,F;
ll minL[100006], minR[100006];
struct node
{
ll c;
ll f;
};
node a[100006];
bool cmp(node a,node b)
{
return a.c < b.c;
}
int judge(int i)
{
if(minL[i] + minR[i] + a[i].f <= F)
return 1;
else
return 0;
}
ll solve()
{
ll sum=0;
priority_queue<ll>q;
for (int i=0;i<C;i++)
{
if(i<N/2)
{
q.push(a[i].f);
sum=sum+a[i].f;
}
else
{
minL[i]=sum;
if(a[i].f<=q.top())
{
sum=sum-q.top();
q.pop();
q.push(a[i].f);
sum=sum+a[i].f;
}
}
}
sum=0;
while(!q.empty())
{
q.pop();
}
for(int i=C-1;i>=0;i--)
{
if(i>C-1-N/2)
{
q.push(a[i].f);
sum=sum+a[i].f;
}
else
{
minR[i]=sum;
if(a[i].f<=q.top())
{
sum=sum-q.top();
q.pop();
q.push(a[i].f);
sum=sum+a[i].f;
}
}
}
for(int i=C-1-N/2;i>=N/2;i--)
{
if(judge(i))
return a[i].c;
}
return -1;
}
int main()
{
cin>>N>>C>>F;
for(int i=0;i<C;i++)
{
scanf("%I64d %I64d",&a[i].c,&a[i].f);
//cin>>a[i].c>>a[i].f;
}
sort(a,a+C,cmp);
cout<<solve()<<endl;
return 0;
}