POJ 2010 G - Moo University - Financial Aid(最小化第K大)
阿新 • • 發佈:2018-11-15
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; }