hdu2413(二分+二分匹配)
题意:人和外星人星球大战,人总共有H个星球,外星人有A个星球,现在人要用飞船去打外星人的飞船,
要求每个人类星球只能对战一个外星球,且每个星球都开始有己知的飞船数,不论是人或外星人的星球,
并每个星球都有一个生产飞般的生产率p,既每年可以生产p只飞般。
人类飞般去打外星球时要经过一定的时间year才能到达所打的星球。
而外星球也会在这一段时间里生产飞般,人类星球要想赢一个外星人的星球必须飞船数不小于外星球的飞船数。
问人类星要想打赢所有的外星人星球最少需要多少年,如果不能打完所有外星球就输出IMPOSSIBLE.
做法是二分+二分匹配,二分时间
首先如果H<A那肯定不行
我们二分时间,建图就是如果人类的x星球能在规定时间内击败敌人的y星球,那就让x->y连边
然后二分匹配,如果每个外星球都匹配到了人类星球,就return true,不然return false;
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int MAX=<<;
int n,m;
typedef struct node
{
ll rate,yuan;
}node ;
node arr[],axx[];
ll times[][];
bool used[];
int belong[];
bool map[][];
bool checks(int a,int b,ll lim)
{
if(times[a][b]>lim)return false ;
ll nums=axx[b].yuan+axx[b].rate*times[a][b];
if(arr[a].rate<=axx[b].rate)return arr[a].yuan>=nums;
else
{
if(arr[a].yuan>=nums)return true;
ll cost=(nums-arr[a].yuan+arr[a].rate-axx[b].rate-)/(arr[a].rate-axx[b].rate)+times[a][b];
return cost<=lim;
}
}
bool dfs(int now)
{
int i,j;
for(i=;i<m;i++)
{
if(!used[i]&&map[now][i])
{
used[i]=;
if(belong[i]==-||dfs(belong[i]))
{
belong[i]=now;
return true;
}
}
}
return false;
}
bool check(ll mid)
{
memset(map,,sizeof(map));
memset(belong,-,sizeof(belong));
int i,j;
for(i=;i<n;i++)for(j=;j<m;j++)map[i][j]=checks(i,j,mid);
int num=;
for(i=;i<n;i++)
{
memset(used,,sizeof(used));
if(dfs(i))num++;
}
return num==m;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)return ;
for(i=;i<n;i++)scanf("%lld%lld",&arr[i].yuan,&arr[i].rate);
for(i=;i<m;i++)scanf("%lld%lld",&axx[i].yuan,&axx[i].rate);
for(i=;i<n;i++)for(j=;j<m;j++)scanf("%lld",×[i][j]);
ll l=,r=;
if(n<m||!check(r))
{
printf("IMPOSSIBLE\n");
continue;
}
while(r-l>)
{
ll mid=(l+r)/;
if(check(mid))r=mid;
else l=mid;
}
ll ans=l;
if(!check(ans))ans++;
printf("%lld\n",ans);
}
}
hdu2413(二分+二分匹配)的更多相关文章
- UVALive 2238 Fixed Partition Memory Management(二分完美匹配)
题意:计算机中有一些固定大小的内存,内存越大,处理速度越快.对于一个程序,加入不同的内存空间,处理所需时间不同.现给出m个内存空间,n个程序,对于每个程序程序,有k组数据(s,t),分别表示当程序 i ...
- BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配
BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...
- Hihocoder 1128 二分·二分查找
二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪 ...
- hihoCoder 1133 二分·二分查找之k小数(TOP K算法)
#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很 ...
- hihocoder hiho第38周: 二分·二分答案 (二分搜索算法应用:二分搜索值+bfs判断可行性 )
题目1 : 二分·二分答案 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后 ...
- hiho week 38 P1 : 二分·二分答案
P1 : 二分·二分答案 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回和上上回里我们知道Nettle在玩&l ...
- hiho week 37 P1 : 二分·二分查找之k小数
P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩&l ...
- hdu 1669(二分+多重匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 思路:由于要求minimize the size of the largest group,由此 ...
- ZOJ 3156 Taxi (二分 + 二分匹配)
题意:给定 n 个人坐标, m 辆车的坐标,还有人的速度,要求每个人要进一辆不同的车,问你所有都进车的最短时间是多少. 析:首先二分时间 mid,很明显就是最后那个人进车的时间,然后如果把第 i 个人 ...
随机推荐
- malloc与new相关
前言: 通常我们使用数组的时候:必须提前用一个常量来指定数组的长度,同时它的内存空间在编译的时候就已经被分配了.但是有时候数组的长度只有在运行的时候才能知道.因此,一种简单的解决方案就是提前申请一块较 ...
- 深度解析PHP数组函数array_slice
看到array_slice()这个函数让我想起了VFP中的range这个范围取值的子句 这个函数一共有四个参数: 被取值的数组(必需) 取值的起始位置(必需) 取值的终止位置,如果不填写默认到数组最后 ...
- (数字IC)低功耗设计入门(七)——门级电路低功耗设计优化(续)
前面讲解了门级功耗的优化方法,包括静动态和总体的功耗.现在来记录一下门级层次(有点书也说是在系统级)常用的一种低功耗方法--电源门控. ①电源门控概述与原理 电源门控是指芯片中某个区域的供电电源被关掉 ...
- javascript痛点之一变量作用域
1.用var声明的变量是有作用域的,比如我们在函数中用var声明一个变量 1 'use strict'; 2 function num(){ 3 //用var声明一个变量num1 4 var num1 ...
- 基于cookie使用过滤器实现客户每次访问自登陆一次
原创声明:本文为本人原创作品,绝非他处摘取,转载请联系博主 相信大家在各大网站都会遇到,登录时,在登录框出现下次免登陆/一个月免登陆的类似选项,本次博文就是讲解如何实现,在这记录一下,也算是做个备忘录 ...
- 对pathtracing的一些个人理解
本人水平有限,若有错误也请指正~ 上面说到pathtracing(pt)的一些优点和缺点,优点即其实现很简单,这就是大概为什么当今市面上流行的很多渲染器如今都相继采用pathtracing算法为核心进 ...
- 关于AD9516芯片的硬件设计和FPGA程序编写心得
最近在做一个项目,其中有涉及时钟芯片AD9516的硬件设计和软件编程,有些使用心得,供大家参考讨论. AD9516,这是一个由ADI公司设计的14路输出时钟发生器,具有亚皮秒级抖动性能,还配有片内集成 ...
- C语言到C++(1) - 基本变化
说到C++和C语言的区别,大部分人都会想到面向对象和面向过程.然而这种说法并不准确.面向对象和面向过程指的是两种不同的程序设计思想,而C++与C是两种编程语言,难道C++就不能用于面向过程去解决问题吗 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(九)--My ...
- SpringMVC form:form的一个错误(没有传到前台绑定类)
SpringMVC form:form的一个错误(没有传到前台绑定类) 报错信息: Neither BindingResult nor plain target object for bean nam ...