[优先队列] POJ2010 Moo University - Financial Aid
来源:互联网 发布:数据库漏洞扫描 编辑:程序博客网 时间:2024/05/22 04:49
题意:奶牛学校招生,c头奶牛报名,要选n头(n为奇数),学校是义务制,所以每头奶牛的学费都由学校负责。每头奶牛都由自己的考试分数和它需要花的学费,学校总共有f的资金,问合法招生方案中中间分数(即排名第(n+1)/2)最高的是多少。
题解:先将所有的奶牛按照分数由高到低排序,假设k是招的奶牛中排名中间的那头,按照排序可知,[1,k-1]中的奶牛必定被招了(n-1)/2头,[k+1,c]中也必定被招了(n-1)/2头,而且无论招的是谁,分数是怎么样,最后影响结果的都只是k的分数。于是,可以预处理dpl[i]代表[1,i]头牛中选出(n-1)/2头牛的最小花费,dpr[i]代表[i,c]头牛中选出(n-1)/2头牛的花费,预处理方法可以用一个大顶堆,复杂度nlogn,最后枚举中间牛复杂度n。
#include<cstdio>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int N=101000;int dpl[N],dpr[N];priority_queue<int> Q;struct Data{ int s,f;}cow[N];bool comp(Data a,Data b){ if(a.s!=b.s) return a.s>b.s; else return a.f<b.f;}int main(){ int n,c,f; while(scanf("%d%d%d",&n,&c,&f)!=EOF) { int nu=(n-1)/2; for(int i=1;i<=c;i++) scanf("%d%d",&cow[i].s,&cow[i].f); sort(cow+1,cow+c+1,comp); while(!Q.empty()) Q.pop(); int sum=0; for(int i=1;i<=nu;i++) Q.push(cow[i].f),sum+=cow[i].f; dpl[nu]=sum; for(int i=nu+1;i<=c;i++) { if(cow[i].f>=Q.top()) dpl[i]=sum; else { sum=sum-Q.top()+cow[i].f; Q.pop(); Q.push(cow[i].f); dpl[i]=sum; } } sum=0; while(!Q.empty()) Q.pop(); for(int i=c;i>=c-nu+1;i--) Q.push(cow[i].f),sum+=cow[i].f; dpr[c-nu+1]=sum; for(int i=c-nu;i>=1;i--) { if(cow[i].f>=Q.top()) dpr[i]=sum; else { sum=sum-Q.top()+cow[i].f; Q.pop(); Q.push(cow[i].f); dpr[i]=sum; } } bool flag=false; for(int i=nu+1;i<=c-nu;i++) { if(cow[i].f+dpl[i-1]+dpr[i+1]<=f) { flag=true; printf("%d\n",cow[i].s); break; } } if(!flag) printf("-1\n"); } return 0;}
0 0
- POJ2010 Moo University - Financial Aid 优先队列
- [优先队列] POJ2010 Moo University - Financial Aid
- POJ2010-Moo University - Financial Aid-优先队列
- POJ2010--Moo University-Financial Aid(优先队列)
- POJ2010 Moo University - Financial Aid
- poj2010-Moo University-Financial Aid
- POJ2010 Moo University - Financial Aid
- poj2010 Moo University - Financial Aid
- poj2010 Moo University - Financial Aid
- POJ2010-Moo University - Financial Aid
- POJ2010-Moo University-Financial Aid
- POJ2010--Moo University-Financial Aid(二分)
- poj2010 Moo University - Financial Aid 二分
- POJ 2010 - Moo University - Financial Aid (优先队列)
- poj 2020Moo University - Financial Aid(优先队列)
- POJ 2010 - Moo University - Financial Aid(优先队列)
- POJ 2010 Moo University - Financial Aid (优先队列)
- Moo University - Financial Aid (poj 2010 优先队列 或者 二分)
- HDU3068 最长回文 manacher
- hdu5371 Hotaru's problem(manacher 算法+枚举)
- hdu 3466 Proud Merchants(01背包)
- linux下jenkins安装
- 为Android添加HAL模块
- [优先队列] POJ2010 Moo University - Financial Aid
- 两个viewport的故事(第一部分)
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- uva 11796 - Dog Distance(几何)
- 修饰过的Dialog
- Infragistics的介绍以及在ASP.net中使用的总结
- 【后缀数组】
- uva 12325
- graph slam tutorial :从推导到应用2