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;
}
题解:先将奶牛排序,考虑每个奶牛作为中位数时,比它分数低(前面的)的那群牛的学费总和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;
}
相关文章推荐
- json 理解,添加 删除 排序
- 16. php数据库抽象层PDO(五)
- 一个项目 接口编写需要注意的地方
- 奇偶数排序(调序)
- 133. Clone Graph【M】【73】【图的遍历】【再来一遍】【vip】
- 摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。
- “两学一做”知识竞赛试题(附答案)
- 荷兰国旗问题
- 92-Integer Break
- poj之旅——3614
- Sublime Text自定制代码片段(Code Snippets)
- 阅读王垠《怎样写一个解释器》一文后的一些体会
- Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题
- Linux下Kill函数用法
- sprint个人总结+读书博客
- Android 属性动画(Property Animation) 完全解析 (上)
- 微信硬件平台的基础接入和硬件云标准接入分析
- 使用NOPI实现Excel导入导出类
- ThinkPHP3.2.3学习笔记5---模板(一)
- iOS项目中引用多个第三方库引发冲突的解决方法