POJ 2010 G - Moo University - Financial Aid(最小化第K大)

版权声明:低调地前行,越努力越幸运! https://blog.csdn.net/SSYITwin/article/details/83650210

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;
}

猜你喜欢

转载自blog.csdn.net/SSYITwin/article/details/83650210