您的位置:首页 > 其它

poj之旅——2010(队列)

2016-05-27 12:33 344 查看
题目描述:奶大招生,从C头奶牛中招收N头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此中位数

题解:先将奶牛排序,考虑每个奶牛作为中位数时,比它分数低(前面的)的那群牛的学费总和lower_i,后面的总和upper_i。然后从分数高往分数低扫描,满足aid_i
+ lower_i + upper_i <= F的第一个解就是最优解。

参考程序:#include<cstdio>
#include<algorithm>
#include<queue>
#include<functional>
#define INF 0x3f3f3f3f
#define maxn 110000
using namespace std;
pair<int,int> cow[maxn];
priority_queue<int> q;
int lower[maxn];
int upper[maxn];
int main(){
int n,m,tcost;
scanf("%d %d %d",&n,&m,&tcost);
for (int i=0;i<m;i++)scanf("%d %d",&cow[i].first,&cow[i].second);
sort(cow,cow+m);
int half=n/2;
int tot=0;
for (int i=0;i<m;i++){
lower[i]=q.size()==half?tot:INF;
q.push(cow[i].second);
tot+=cow[i].second;
if (q.size()>half){
tot-=q.top();q.pop();
}
}
while (!q.empty())q.pop();
tot=0;
for (int i=m-1;i>=0;i--){
upper[i]=q.size()==half?tot:INF;
q.push(cow[i].second);
tot+=cow[i].second;
if (q.size()>half){
tot-=q.top();q.pop();
}
}
int ans=-1;
for (int i=m-1;i>=0;i--)
if (cow[i].second+lower[i]+upper[i]<=tcost){ans=cow[i].first;break;}
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: