Poj2010 Moo University - Financial Aid
题意的话,就看其他人的吧
概括:二分中位数
大体上便是二分一个中位数,带入检验,若分数比他小的有\(\lfloor n/2 \rfloor\)个,分数比他的大的也有这么多,而且贪心的买,花费小于预算。
便带入到数作为中位数是可以的。记录并进行下一次二分
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using std::sort;
const int maxn=101000;
struct node
{
int id;
long long score;
long long cost;
node ( ) { id=score=cost=0; }
};
node base[maxn],pas[maxn];
int rank[maxn];
long long n,c,f;
int compare1(const node &a,const node &b)
{
if(a.score!=b.score) return a.score<b.score;
return a.cost<b.cost;
}
int compare2(const node &a,const node &b)
{
return a.cost<b.cost;
}
int mk_it(int v)
{
long long T1=0,T2=0,Tot=base[v].cost;//T1为前半部分选取的个数,T2为后半部分选取的个数,Tot为总花费
for(int i=1;i<=c&&Tot<=f&&T1+T2+1<n;i++)
{
int Id=pas[i].id,F=0;//F是用来防止同一个分数,在下面被选了两次
if(Id==base[v].id) continue;
if((rank[Id]<rank[base[v].id]||pas[i].score==base[v].score)&&T1<(n>>1))
{
++T1;F=1;
Tot+=pas[i].cost;
}
if((rank[Id]>rank[base[v].id]||pas[i].score==base[v].score)&&T2<(n>>1)&&!F)
{
++T2;
Tot+=pas[i].cost;
}
}
return T1+T2+1==n&&Tot<=f;//返回是否可行
}
int main()
{
scanf("%lld%lld%lld",&n,&c,&f);
for(int i=1;i<=c;i++)
{
scanf("%lld%lld",&base[i].score,&base[i].cost);
base[i].id=i;
}
sort(base+1,base+1+c,compare1);//按照分数排序
for(int i=1;i<=c;i++) rank[base[i].id]=i,pas[i]=base[i];//记录排名(检验时用到)
sort(pas+1,pas+1+c,compare2);//按照价钱排序
int l=1,r=c;
long long ans=-1;
while(l<=r)//二分
{
int mid=(l+r)>>1;
if(mk_it(mid))
ans=base[mid].score,l=mid+1;
else
r=mid-1;
}
printf("%lld",ans);
}
Poj2010 Moo University - Financial Aid的更多相关文章
- poj2010 Moo University - Financial Aid 优先队列
Description Bessie noted that although humans have many universities they can attend, cows have none ...
- POJ2010 Moo University - Financial Aid(二分法)
题目地址 分析:如果用二分法,关键是score和aid分开排序,score排序是为了充分利用中位数的性质,这样就可以确定m左右必须各选N/2个,到这之后有人是用dp求最优解,可以再次按照aid排序一次 ...
- 【POJ - 2010】Moo University - Financial Aid(优先队列)
Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...
- Divide and conquer:Moo University - Financial Aid(POJ 2010)
Moo University - Financial Aid 其实是老题了http://www.cnblogs.com/Philip-Tell-Truth/p/4926008.html 这一次我们换二 ...
- Moo University - Financial Aid
Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6020 Accep ...
- poj 2010 Moo University - Financial Aid
Moo Univ ...
- POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...
- poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会
Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6599 A ...
- poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)
Description Bessie noted that although humans have many universities they can attend, cows have none ...
随机推荐
- 一:Linux知识整理
一.文件系统的管理 tips:输入命令的时候要常用tab键来补全 ls 查看目录信息 ( ls / ) ls -l 等价于 ll pwd 查看当前所处的路径 cd 切换目录 (cd /) ,如果不带参 ...
- 三、thymeleaf的使用
1.简介 thymleaf是一个基于html的页面模板,springboot极力推荐使用它,代替jsp. API地址:https://www.thymeleaf.org/doc/tutorials/3 ...
- Spring Cloud实战之初级入门(六)— 服务网关zuul
目录 1.环境介绍 2.api网关服务 2.1 创建工程 2.3 api网关中使用token机制 2.4 测试 2.5 小结 3.一点点重要的事情 1.环境介绍 好了,不知不觉中我们已经来到了最后一篇 ...
- 【转】spring boot使用Druid和监控配置
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012100371/article/details/76602612 Druid是Java语言中最好 ...
- redis的安全问题
1.修改redis.conf配置文件 2.重启redis服务,使其生效 3.成功登陆以后,使用auth+密码 或者在登录的时候使用-a 密码的授权方式
- java 单例的实现及多线程下的安全
package com.demo01; public class Single { /** * 设计模式:单例设计模式 * 解决一个类中只允许存在一个对象这种情况: * 不允许通过类,无限制的创建该类 ...
- 巧用dynamic给对象字段动态赋值(经测试无效,使用反射解决)
动态把json对象的字段值赋给某个对象的字段 var dt=Utils.JsonDataTableConvert.ToDataTable(tableJson); foreach (DataRow ro ...
- Scrapy安装教程 pip 或 conda 两种安装方法.
cmd: pip -V 查看pip版本 pip install --upgrade pip 升级最高版本 https://sourceforge.net/projects/py ...
- 用iframe踩的坑
1.无法监控iframe加载成功与否 经测试,火狐及chorme都不支持onerror事件,而且,不管iframe加载是否成功,都会触发onload事件. 1)通过postmessage消息提示是否加 ...
- web前端优化之内容优化
前端内容优化主要有以下几条: 1.尽量减少http请求 (1)合并文件,把多个css文件合并在一起: (2)css Sprites,把css相关的background元素进行背景图绝对定位: (3)图 ...