题意: 给出 n  个人,知道了每个人的成绩,和每个人想要的奖学金,要求从这些学生中找出 m (奇数)个人满足选出的人的成绩的中位数最大,且这些人总的奖学金需求要

小于等于总的奖学金数。

分析: 可以先对学生按成绩降序排序,然后从 位置 m/2+1 到 N - m/2 枚举,中位数 q[i]  ,因此对于枚举每个中位数只要求出左面 最小的 m/2  个数,和右面最小的 m/2 个

数,只要 left[i-1]+q[i].money+rght[i+1] <=F ,i 即为要找的学生。

left[i] 表示从 i 个位置向左的序列中最小的 m/2个数之和,对于每次出现新的 i 值,要求出 m/2 个最小的数这个过程可以建一个堆来维护,right[i]同样。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{long long grade;long long money;
}q[100005];
int cmp(const void*p1,const void*p2)
{node *c=(node*)p1;node *d=(node*)p2;return d->grade-c->grade;
}
long long left[100005];
long long right[100005];
void swap(long long &a,long long &b)
{   long long t=a; a=b; b=t; }
void down(int i,int n,long long a[])
{int son;for(;i<=n/2;i=son){son=i<<1;if((son!=n)&&a[son+1]>a[son])son=son+1;if(a[son]>a[i])swap(a[son],a[i]);}
}
long long sum;
long long heap[100005];
long long heap_update(int x,int n)
{if(x<heap[1]){sum-=heap[1]-x;heap[1]=x;down(1,n,heap);}return sum;
}
void init(long long a[],int n)
{int i;for(i=n/2;i>=1;i--)down(i,n,a);
}
int main()
{int l,r,n,m,i,j;long long F;while(scanf("%d%d%lld",&m,&n,&F)!=EOF){for(i=1;i<=n;i++)scanf("%lld%lld",&q[i].grade,&q[i].money);l=1+m/2;r=n-m/2;qsort(q+1,n,sizeof(q[0]),cmp);sum=0;for(i=1;i<l;i++){sum+=q[i].money;heap[i]=q[i].money;}init(heap,m/2);left[l-1]=sum;for(i=l;i<=n;i++)left[i]=heap_update(q[i].money,m/2);sum=0;for(i=n;i>r;i--){sum+=q[i].money;heap[n-i+1]=q[i].money;}init(heap,m/2);right[r+1]=sum;for(i=r;i>=1;i--)right[i]=heap_update(q[i].money,m/2);for(i=l;i<=r;i++)if(left[i-1]+right[i+1]+q[i].money<=F)break;if(i>r)printf("-1\n");else printf("%lld\n",q[i].grade);}return 0;
}

转载于:https://www.cnblogs.com/dream-wind/archive/2012/08/07/2627291.html

POJ 2010 Moo University - Financial Aid【堆的应用】相关推荐

  1. POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)

    按照score排序,贪心,从左到右用堆维护并且记录前面的最小N/2个花费之和. 然后从右向左枚举中位数,维护N/2个数之和加上并判断是否满足条件.(stl的队列没有clear(),只能一个一个pop. ...

  2. bzoj 3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助(set+贪心)

    3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助 Time Limit: 10 Sec  Memory Limit: 128 MB S ...

  3. POJ2010 Moo University - Financial Aid 优先队列

    题目大意是有一批学生上大学,但是需要一些奖学金才上得起,学校给的奖学金aid有限,并且学校的教室只能让N个学生来上学,N为奇数,所以学校希望在在所有参加入学考试的C名学生中选取N个学生,为了提高教学质 ...

  4. POJ2010 Moo University - Financial Aid

    题目链接:https://vjudge.net/problem/POJ-2010 题目大意: 有 \(C\) 头牛,每头牛有一个分数和需要资助的钱.现在要资助 \(N\) 头牛,总资助金额不能超过 \ ...

  5. Poj 2010-Moo University - Financial Aid

    Moo University - Financial Aid 题目链接:http://poj.org/problem?id=2010 Time Limit: 1000MS   Memory Limit ...

  6. POJ - 2008 Moo University - Team Tryouts

    题目描述 给定dn组数据, 数据包括w, h, 给定a, b, c; 求一个子集, 子集里面所有的元素都满足A*(H-h) + B*(W-w) <= C w为子集里面最小的w , h表示子集里面 ...

  7. POJ 2231 Moo Volume(递推、前缀和)

    题外话: POJ 2231 Moo Volume 题意: 解题过程: AC代码: 题外话: emm--第三套题好像综合了其他OJ的题目蛤,那么我就把题目分开了发了蛤蛤-- POJ 2231 Moo V ...

  8. POJ 1442 Black Box(大小堆,求第K小的元素)

    文章目录 1. 题目链接 2. 题目解读 3. 代码 3.1 Runtime Error 代码 1. 题目链接 http://poj.org/problem?id=1442 2. 题目解读 可以利用大 ...

  9. poj 2010(优先队列)

    题意: 奶牛大学:奶大招生,从C头奶牛中招收N头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 解题思路:这里要求最大中位数,中位数肯 ...

最新文章

  1. 使用Process Explorer查看托管进程的性能记数器
  2. 千里之行,始于OKR——轻雀协作团队管理分享
  3. windows7内存诊断工具有用吗_windows内存诊断工具有什么用
  4. 如何在本地搭建一个Android应用crashing跟踪系统-ACRA
  5. 攻击者利用Python 勒索软件加密 VMware ESXi 服务器
  6. 百度贴吧中的匿名回复,根本不是匿名,完全可以看到用户的全部IP。
  7. 三点弯曲弹性模量怎么计算公式_腰背肌锻炼:五点支撑和三点支撑(视频)
  8. securecrt修改mysql密码_在CentOS下Mysql5.5的密码修改
  9. form 表单添加请求头_Golang GinWeb框架5-绑定多种请求类型的数据
  10. linux看网卡ip,linux查看ip地址、显示太网卡配置、网络设备
  11. Excel表格样式CellStyle的DataFormat可选值
  12. 关于图像客观质量评价
  13. linux 微信安装
  14. python百度翻译api申请网页版_python3调用百度翻译api接口实现全过程
  15. MIoU(均交并比)的计算
  16. Fio 命令生产环境测试
  17. jq.1.10.2.min.js中报错最后一行得解决办法
  18. 网络:TCP的三次握手
  19. PHP LOL接口,电竞英雄联盟数据API接口 - 【赛事列表】API调用示例代码
  20. MSDTC服务无法启动

热门文章

  1. 使用SpringTest测试,默认情况事务是不会提交的
  2. HDU1693 Eat The Trees(插头dp)
  3. windows 2008 server 各版本功能差异
  4. 31天重构学习笔记17. 提取父类
  5. java笔记:第6章 面向对象程序设计
  6. android 模拟器 3D 开发环境配置
  7. Android中的观察者DataSetObservable和DataSetObserver
  8. attempt to write a readonly database 错误
  9. 写项目经历的注意事项
  10. 协议 - 收藏集 - 掘金