poj2010 Moo University - Financial Aid(最大化第k大)
来源:互联网 发布:药品查询真伪软件 编辑:程序博客网 时间:2024/05/22 05:05
题意:
奶牛大学招生,从C头奶牛中招收N头牛。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此满足题意的最大中位数。
思路:求分数最大的中位数,那么首先对分数排序,二分每一个分数作为中位数,看是否满足条件,这里满足条件又根据贪心选择奖学金少的奶牛。然后注意这里判断,不同情况的处理和标准二分有一些不同。分析,当选择某一个分数判断的时候,发现左右两端的都没有达到一半,说明不可能凑得出来N个奶牛,当左边少了说明mid小了,同理。
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int N,C,F;struct node{ int s,v,t;}a[100000+20],b[100000+20];bool cmp1(node a,node b){ return a.s<b.s;}bool cmp2(node a,node b){ return a.v<b.v;}int check(int x){ int l=0,r=0,sum=a[x].v; for(int i=0;i<C;i++){ if(l>=N/2&&r>=N/2) break; if(b[i].t<x&&l<N/2&&sum+b[i].v<=F) l++,sum+=b[i].v; else if(b[i].t>x&&r<N/2&&sum+b[i].v<=F) r++,sum+=b[i].v; } if(l<N/2&&r<N/2) return 0; else if(l<N/2) return 1; else if(r<N/2) return 2; else return 3;}int main(){ scanf("%d%d%d",&N,&C,&F); for(int i=0;i<C;i++) scanf("%d%d",&a[i].s,&a[i].v); sort(a,a+C,cmp1); for(int i=0;i<C;i++){ b[i].s=a[i].s;b[i].v=a[i].v;b[i].t=i; } sort(b,b+C,cmp2); int l=0,r=C,ans=-1; while(l<=r){ int mid=(l+r)/2; if(check(mid)==0) {ans=-1;break;} else if(check(mid)==1) l=mid+1; else if(check(mid)==2) r=mid-1; else if(check(mid)==3) { ans=a[mid].s,l=mid+1;} } printf("%d\n",ans);}
0 0
- poj2010 Moo University - Financial Aid(最大化第k大)
- 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(优先队列or二分搜索—最大化K大值)
- Moo University - Financial Aid
- Moo University - Financial Aid(2010)
- (堆操作) Moo University - Financial Aid (P2010)
- 归并排序 递归版和非递归版的实现(java)
- 逻辑运算
- SpotLight和NSUserActivity的使用
- 码农小汪-Spring MVC -DispatcherServlet 详解
- ios之多线程-NSThead、GCD、NSOperationQueue
- poj2010 Moo University - Financial Aid(最大化第k大)
- POJ 2831:Can We Build This One?
- 关系规范化之分解的函数依赖保持性判定
- Apple开始拒绝使用UIWebBrowserViewIonic的app上架
- RxJava错误处理
- 编程珠玑ch02
- 路由器 VS OSI七层模型
- SM2算法第六篇:Linux Socket编程(不限于Linux)
- 判断早上下午,星期几