Moo University - Financial Aid
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 6599   Accepted: 1926

Description

Bessie noted that although humans have many universities they can attend, cows have none. To remedy this problem, she and her fellow cows formed a new university called The University of Wisconsin-Farmside,"Moo U" for short.

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

* Line 1: Three space-separated integers N, C, and F

* 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

* Line 1: A single integer, the maximum median score that Bessie can achieve. If there is insufficient money to admit N calves,output -1. 

Sample Input

3 5 70
30 25
50 21
20 20
5 18
35 30

Sample Output

35

Hint

Sample output:If Bessie accepts the calves with CSAT scores of 5, 35, and 50, the median is 35. The total financial aid required is 18 + 30 + 21 = 69 <= 70. 

Source

题意:给你c头牛,每买一头牛都有一定的花费,要求从中选出n头牛,使得在总花费<=f的情况下使得中位数最大;
错因分析:一开始就陷入了二分的固定思维,下面第一份的自己的WA代码
#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 最大化中位数 二分搜索 以后需要慢慢体会的更多相关文章

  1. POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)

    POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...

  2. poj 2010 Moo University - Financial Aid

                                                                                                Moo Univ ...

  3. poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)

    Description Bessie noted that although humans have many universities they can attend, cows have none ...

  4. poj -2010 Moo University - Financial Aid (优先队列)

    http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U&quo ...

  5. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

  6. poj 2010 Moo University - Financial Aid (贪心+线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...

  7. POJ 2010 Moo University - Financial Aid treap

    按第一关键字排序后枚举中位数,就变成了判断“左边前K小的和 + 这个中位数 + 右边前K小的和 <= F",其中维护前K小和可以用treap做到. #include <cstdi ...

  8. POJ 2010 Moo University - Financial Aid 优先队列

    题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...

  9. POJ 2010 Moo University - Financial Aid (优先队列)

    题意:从C头奶牛中招收N(奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 思路: 先将奶牛排序,考虑每个奶牛作为中位数时,比它 ...

随机推荐

  1. mysql拆分逗号一列变多行

    需求: SELECT ), ) FROM TABLE a INNER JOIN mysql.help_topic b )

  2. HanLP-分类模块的分词器介绍

    最近发现一个很勤快的大神在分享他的一些实操经验,看了一些他自己关于hanlp方面的文章,写的挺好的!转载过来分享给大家!以下为分享原文(无意义的内容已经做了删除) 如下图所示,HanLP的分类模块中单 ...

  3. Heavy Transportation POJ 1797 最短路变形

    Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...

  4. golang 组装返回json数据,提供api接口

    model里 package model type Setting struct { Key string `gorm:"primary_key" json:"key&q ...

  5. redis在php中实际应用-hash

    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. 目录: 1.批量赋值:hmset,hmget,hgetall 可用于存储一条条数据,即一个 ...

  6. k8s 1.9安装

    关闭所有节点的selinux.iptables.firewalld systemctl stop iptables systemctl stop firewalld systemctl disable ...

  7. Eclipce远程调试

    1.注意: root权限启动的进程不支持远程调试,也有很多隐患,支持最高权限,应用普通用户启动,又原先安装Tomcat是使用的root权限,普通用户对root安装的软件没有执行权限,可以修改相应权限, ...

  8. 剑指offer-数组中只出现一次的数字-数组-python

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   # -*- coding:utf-8 -*- class Solution: # 返回[a, ...

  9. 异常-throw的概述以及和throws的区别

    package cn.itcast_06; /* * throw:如果出现了异常情况,我们可以把该异常抛出,这个时候的抛出的应该是异常的对象. * * throws和throw的区别(面试题) thr ...

  10. bzoj 4722 由乃

    bzoj 先考虑一种简单的情况,即这个区间是否有相同的数,因为值域大小为1000,那么当区间长度\(>1000\)时,根据鸽巢原理,一定会有两个相同的数,这时候可以直接输出Yuno 进一步的,对 ...