poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 6599 | Accepted: 1926 |
Description
Not wishing to admit dumber-than-average cows, the founders created an incredibly precise admission exam called the Cow Scholastic Aptitude Test (CSAT) that yields scores in the range 1..2,000,000,000.
Moo U is very expensive to attend; not all calves can afford it.In fact, most calves need some sort of financial aid (0 <= aid <=100,000). The government does not provide scholarships to calves,so all the money must come from the university's limited fund (whose total money is F, 0 <= F <= 2,000,000,000).
Worse still, Moo U only has classrooms for an odd number N (1 <= N <= 19,999) of the C (N <= C <= 100,000) calves who have applied.Bessie wants to admit exactly N calves in order to maximize educational opportunity. She still wants the median CSAT score of the admitted calves to be as high as possible.
Recall that the median of a set of integers whose size is odd is the middle value when they are sorted. For example, the median of the set {3, 8, 9, 7, 5} is 7, as there are exactly two values above 7 and exactly two values below it.
Given the score and required financial aid for each calf that applies, the total number of calves to accept, and the total amount of money Bessie has for financial aid, determine the maximum median score Bessie can obtain by carefully admitting an optimal set of calves.
Input
* Lines 2..C+1: Two space-separated integers per line. The first is the calf's CSAT score; the second integer is the required amount of financial aid the calf needs
Output
Sample Input
3 5 70
30 25
50 21
20 20
5 18
35 30
Sample Output
35
Hint
Source
#include<cstdio>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include<map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long LL;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
struct Node{
int s,m,id;
}node[20005];
int n,c,f,k;
bool cmp(Node a,Node b)
{
return a.m<b.m;
}
int ok(int mid)
{
int cnt1=0,cnt2=0,total=0;
for(int i=1;i<=c;i++)
if(node[i].s<mid&&cnt1<k)
{
cnt1++;
total+=node[i].m;
} //在加进一头牛时没有判断假设加进后总费用是否<=f;
else if(node[i].s>mid&&cnt2<(n-k))
{
cnt2++;
total+=node[i].m;
}
if(cnt1<k||cnt2<(n-k)||total>f)
return 0;
else return 1;
}
int main()
{
while(~scanf("%d %d %d",&n,&c,&f))
{
int maxn=0;
for(int i=1;i<=c;i++)
{
scanf("%d %d",&node[i].s,&node[i].m);
if(maxn<node[i].s)
maxn=node[i].s;
}
sort(node+1,node+1+c,cmp);
int l=0,r=maxn+1;
k=(n+1)/2;
while(r-l>1)
{
int mid=(l+r)/2;
if(ok(mid))
r=mid;
else
l=mid;
}
printf("%d\n",r-1);
}
return 0;
}
第二份是AC代码:总的思想是先进行score排序,记录好数据后,二分枚举可能的取到的中位(因为score已经排好序,所以尽量往id大的取),然后money排序,进行贪心的选取。
#include<cstdio>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include<map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long LL;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
struct Node{
int s,m,id;
}node[100005];
int n,c,f,k,score[100005],weight[100005];
bool cmpm(Node a,Node b)
{
return a.m<b.m;
}
bool cmps(Node a,Node b)
{
return a.s<b.s;
}
int main()
{
while(~scanf("%d %d %d",&n,&c,&f))
{
for(int i=1;i<=c;i++)
scanf("%d %d",&node[i].s,&node[i].m);
sort(node+1,node+1+c,cmps);
for(int i=1;i<=c;i++)
{
node[i].id=i;
score[i]=node[i].s;
weight[i]=node[i].m;
}
int ans=-1,l=0,r=c+1;
sort(node+1,node+1+c,cmpm);
k=n/2;
while(r-l>1)
{
int mid=(l+r)>>1;
int total=weight[mid],cnt1=0,cnt2=0;
for(int i=1;i<=c;i++)
if(cnt1<k&&node[i].id<mid&&node[i].m+total<=f)
{
cnt1++;
total+=node[i].m;
}
else if(cnt2<k&&node[i].id>mid&&node[i].m+total<=f)
{
cnt2++;
total+=node[i].m;
}
if(cnt1<k&&cnt2<k)
break;
else if(cnt1>=k&&cnt2>=k)
{
l=mid;//尽量往右选取
ans=score[l];
}
else if(cnt1<k)
l=mid;
else if(cnt2<k)
r=mid;
}
printf("%d\n",ans);
}
return 0;
}
poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会的更多相关文章
- POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...
- poj 2010 Moo University - Financial Aid
Moo Univ ...
- poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)
Description Bessie noted that although humans have many universities they can attend, cows have none ...
- poj -2010 Moo University - Financial Aid (优先队列)
http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U&quo ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- poj 2010 Moo University - Financial Aid (贪心+线段树)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...
- POJ 2010 Moo University - Financial Aid treap
按第一关键字排序后枚举中位数,就变成了判断“左边前K小的和 + 这个中位数 + 右边前K小的和 <= F",其中维护前K小和可以用treap做到. #include <cstdi ...
- POJ 2010 Moo University - Financial Aid 优先队列
题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...
- POJ 2010 Moo University - Financial Aid (优先队列)
题意:从C头奶牛中招收N(奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 思路: 先将奶牛排序,考虑每个奶牛作为中位数时,比它 ...
随机推荐
- Linux系统下部署Tomcat服务器
详细步骤如下: 1.下载xshell5和xftp5并安装,登录连接服务器,新建会话窗口: 2.安装配置JDK1.8,具体操作方法如下: (1)下载JDK地址:http://www.oracle.com ...
- 依赖作用域之<scope>test</scope>
经常在代码中看到依赖的作用域为<scope>test</scope>,它的作用是,只能在test目录(通过右键->Make Directory as->Test S ...
- C++学习 之 控制程序流程 (笔记)
1.使用if...else有条件的执行 在一些时候语句需要进行有条件的执行.比如如果输入"Y"就执行赋值语句N=1:否则N=0: #include<iostream> ...
- Github 添加公匙 出错 (我真傻 真的)
网上一搜一箩筐 之前配了很多次都没问题 重装系统后配了半天总是提示 github Key is invalid. You must supply a key in OpenSSH public key ...
- python基本数据类型零碎知识点
...
- Radio stations CodeForces - 762E (cdq分治)
大意: 给定$n$个三元组$(x,r,f)$, 求所有对$(i,j)$, 满足$i<j, |f_i-f_j|\le k, min(r_i,r_j)\ge |x_i-x_j|$ 按$r$降序排, ...
- LintCode 29---交叉字符串
public class Solution { /** * @param s1: A string * @param s2: A string * @param s3: A string * @ret ...
- 01 初识HTML
HTML是什么? 超文本标记语言(Hypertext Markup Language, HTML)是一种用于创建网页的标记语言. 本质上是浏览器可识别的规则,我们按照规则写网页,浏览器根据规则渲染我们 ...
- axios设置了responseType: 'json‘’,ie问题
在ie会有问题 如果返回的数据会变成字符串 在拦截器中用json.parse转 // 在axios的响应头中设置~~~ axios.interceptors.response.use( respons ...
- Ubuntu环境变量设置注意点
设置环境变量时,有一点要注意: /etc/bash.bashrc与/etc/profile是有区别的 什么区别呢? 打开一个新的shell时,会读取/etc/bash.bashrc和~/.bashrc ...