usaco 2005 奶牛大学(财政补助)

【问题描述】
 
  贝西统计到人类拥有很多大学可以去读,而奶牛们却一个大学也没有。为了解决这个问题,她和她的同伴们建立了一所奶牛大学Moo大学。为了防止笨牛入学,学校的创立者搞了一个奶牛智力测试(CSAT),它的分数在区间[1,2000000000]内。 

  Moo大学的学费很昂贵:不是所有奶牛都能负担,事实上,大多数奶牛需要一些财政帮助a。政府不会给奶牛任何资金,所以所有的资金都来自于学校有限的资金,资金总数为F。更糟糕的是,虽然有C头奶牛报考,Moo大学却只能接受N头奶牛,N为奇数。贝西既要让这N头奶牛享受最大限度的教育资源,又要他们的CSAT分数的中位数尽可能高。 

  这里说一下对于一个奇数个数组成的集合中中位数的概念。例如,集合3,8,9,7,5的中位数是7,因为有两个数小于7,有两个数大于7。 

  给出每头奶牛的分数和所需的财政补贴数,可以接纳的牛数,补助的资金总数,求出中位数最大的可能值。
 
【输入格式】
 
  第1行包含三个整数N,C,F。第2到C+1行,每行包含两个整数,第1个数表示这头奶牛的CSAT分数,第2个整数表示这头奶牛所需的补助数额。
 
【输出格式】
 
  一个整数,表示最大的中位数可能值,如不存在输出-1。
 
【输入样例】
 
3 5 70
30 25
50 21
20 20
5 18
25 30

 
【输出样例】
 
30
 
【样例解释】
 
  如果贝西接收CSAT分数为5,35,50的奶牛,中位数为35。总资金要求为18+30+21=69 <= 70
 
【数据范围】
 
1<=N<=19999  1<=a<=100000  0<=F<=2*10^9  0<=C<=100000
 

【来源】

1.usaco 2005   2.某校2018三月信息竞赛考试T4

【题解】

1.先将所有数据按奶牛分数排序

2.枚举以第x头奶牛为中位数是的花费,求最大即可

说明:难度主要在怎么求以X奶牛为中位数时的花费,要找到一种合适的数据结构,否则会超时

方法见代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct data{
	int iq,aid;//分别表示奶牛的得分,需要的资金 
	bool operator <(const data y)const {
		return iq<y.iq;
	}
}a[100005];
priority_queue<int>que1,que2;
int n,c,f,mid;
int sum1[100005],sum2[100005];//保存数据 
void ready(){ 
	sum1[0]=sum2[c+1]=0;
	for(int i=1;i<=mid;i++){
		que1.push(a[i].aid);
		sum1[i]=sum1[i-1]+a[i].aid;
	}
	for(int i=mid+1;i<=c-mid;i++){
		que1.push(a[i].aid);
		int t=que1.top();
		que1.pop();
		sum1[i]=sum1[i-1]+a[i].aid-t; //重点 
	}
	
	for(int i=c;i>c-mid;i--){
		que2.push(a[i].aid);
		sum2[i]=sum2[i+1]+a[i].aid;
	}
	for(int i=c-mid;i>mid;i--){
		que2.push(a[i].aid);
		int t=que2.top();
		que2.pop();
		sum2[i]=sum2[i+1]+a[i].aid-t; //重点 
	}
}
void solve(){
	int ans=-1;
	for(int i=mid+1;i<=c-mid;i++){
		if(sum1[i-1]+sum2[i+1]+a[i].aid<=f) ans=a[i].iq; 
	}
	printf("%d\n",ans);
}
int main(){
//	freopen("aid.in","r",stdin);
//	freopen("aid.out","w",stdout);

	scanf("%d%d%d",&n,&c,&f);
	mid=n/2;//中位数 
	for(int i=1;i<=c;i++) scanf("%d%d",&a[i].iq,&a[i].aid);

	sort(a+1,a+c+1);//预处理 
	ready();
	
	solve();
	return 0;
}

 
 

猜你喜欢

转载自blog.csdn.net/hi_ker/article/details/79687528