网络流(二分):BZOJ 3993: [SDOI2015]星际战争
Description
3333年,在银河系的某星球上,X军团和Y军团正在激烈 地作战。在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai。当一个巨型机器人的装甲值减少到0或 者以下时,这个巨型机器人就被摧毁了。X军团有M个激光武器,其中第i个激光武器每秒可以削减一个巨型机器人Bi的装甲值。激光武器的攻击是连续的。这种 激光武器非常奇怪,一个激光武器只能攻击一些特定的敌人。Y军团看到自己的巨型机器人被X军团一个一个消灭,他们急需下达更多的指令。为了这个目标,Y军 团需要知道X军团最少需要用多长时间才能将Y军团的所有巨型机器人摧毁。但是他们不会计算这个问题,因此向你求助。
Input
第一行,两个整数,N、M。
第二行,N个整数,A1、A2…AN。
第三行,M个整数,B1、B2…BM。
Output
一行,一个实数,表示X军团要摧毁Y军团的所有巨型机器人最少需要的时间。输出结果与标准答案的绝对误差不超过10-3即视为正确。
Sample Input
3 10
4 6
0 1
1 1
Sample Output
HINT
【样例说明1】
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=;
const int maxm=;
const double eps=1e-;
int cnt=,fir[maxn],to[maxm],nxt[maxm];
double cap[maxm];
void addedge(int a,int b){
nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;
} int G[][];
int A[],B[]; void Build(double k,int n,int m){
int ct=;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
if(G[i][j])
cap[++ct]=1e20,cap[++ct]=0.0; for(int i=;i<=m;i++)
cap[++ct]=1.0*B[i]*k,cap[++ct]=0.0; for(int i=;i<=n;i++)
cap[++ct]=1.0*A[i],cap[++ct]=0.0;
} int dis[maxn],gap[maxn],q[maxn],front,back; void BFS(int S,int T){
memset(dis,,sizeof(dis));
front=back=;
dis[T]=;q[back++]=T;
while(front<back){
int node=q[front++];
for(int i=fir[node];i;i=nxt[i]){
if(dis[to[i]])continue;
dis[to[i]]=dis[node]+;
q[back++]=to[i];
}
}
}
double mid;
int path[maxn],fron[maxn];
double ISAP(int S,int T){
double ret=0.0;
BFS(S,T);
for(int i=S;i<=T;i++)gap[dis[i]]++;
int p=S;
double f;
memcpy(fron,fir,sizeof(fir));
while(dis[S]<=T+){
if(p==T){
f=1e20;
while(p!=S){
f=min(f,cap[path[p]]);
p=to[path[p]^];
}
p=T;ret+=f;
while(p!=S){
cap[path[p]]-=f;
cap[path[p]^]+=f;
p=to[path[p]^];
}
}
int &ii=fron[p];
for(;ii;ii=nxt[ii])
if(cap[ii]&&dis[p]==dis[to[ii]]+)
break;
if(ii)
path[p=to[ii]]=ii;
else{
if(--gap[dis[p]]==)break;
int minn=T+;
for(int i=fir[p];i;i=nxt[i])
if(cap[i])
minn=min(minn,dis[to[i]]); ii=fir[p];
++gap[dis[p]=minn+];
if(p!=S)
p=to[path[p]^];
}
}
return ret;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&A[i]);
for(int i=;i<=m;i++)
scanf("%d",&B[i]); for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
scanf("%d",&G[i][j]); for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
if(G[i][j]){
addedge(i,j+m);
addedge(j+m,i);
} for(int i=;i<=m;i++)
addedge(,i),addedge(i,); double tot=0.0;
for(int i=;i<=n;i++){
addedge(i+m,n+m+);
addedge(n+m+,i+m);
tot+=A[i];
}
double lo=,hi=1e5;
while(hi-lo>=1e-){
mid=(lo+hi)/2.0;
Build(mid,n,m);
if(fabs(ISAP(,n+m+)-tot)<eps)
hi=mid;
else
lo=mid;
}
printf("%.4lf\n",hi);
return ;
}
网络流(二分):BZOJ 3993: [SDOI2015]星际战争的更多相关文章
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...
- BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案
链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...
- bzoj 3993: [SDOI2015]星际战争
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #def ...
- 3993: [SDOI2015]星际战争
3993: [SDOI2015]星际战争 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1244 Solved: ...
- 【BZOJ】3993: [SDOI2015]星际战争
题意 \(m\)个人\(n\)个物品,第\(i\)个物品生命值为\(A_i\),第\(i\)个人每秒可以减少一个物品\(B_i\)的生命值,给出一个\(m \times n\)的矩阵,如果\(i\)行 ...
- bzoj3993: [SDOI2015]星际战争(网络流)
3993: [SDOI2015]星际战争 题目:传送门 题解: 洛谷AC了,但是因为bzoj的spj有问题所以暂时没A 一道老题目了,二分时间然后网络流判断. 每次st-->武器连时间*攻击力 ...
- bzoj千题计划131:bzoj3993: [SDOI2015]星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...
- BZOJ_3993_[SDOI2015]星际战争_二分+网络流
BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...
- 【BZOJ3993】[SDOI2015]星际战争 二分+最大流
[BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...
随机推荐
- linux系统下安装wget。
我们先安装linux系统比如centos7.1里面有的就没有wget下载工具.wget这个命令就不可以使用. 我们使用 yum -y install wget yum install perl 会出现 ...
- hadoop集群环境搭建准备工作
一定要注意hadoop和linux系统的位数一定要相同,就是说如果hadoop是32位的,linux系统也一定要安装32位的. 准备工作: 1 首先在VMware中建立6台虚拟机(配置默认即可).这是 ...
- Android布局管理器(表格布局)
表格布局有TableLayout所代表,TableLayout继承了LinearLayout,因此他的本质依然是LinearLayout. 表格布局采用行.列的形式来进行管理,在使用的时候不需要声明多 ...
- CI 笔记4 (easyui 手风琴)
添加父div标签,和子div标签 <div class="easyui-accordion" data-options="fit:true,border:false ...
- C#获取本机IP搜集整理7种方法
今天打算试着写个小聊天程序,但是要用到获取本机IP,以前从没用过.摆渡百度了一会儿,出于贪心,想把各种获取本机IP的方法给找出来.摆渡+测试了几个小时,于是有了下面的成果,有点小累,但看到这些成果,也 ...
- hdoj 1087 (DP)
代码: #include<iostream> #include<cmath> using namespace std; int a[1005], dp[1005]; ...
- hdoj 2047 简单递推
代码: #include <stdio.h>int main(){ int n,m,i; __int64 x[41]; x[1]=3; x[2]=8; for(i=3;i<=40;i ...
- set,multiset容器类型
set和multiset会根据特定的排序准则,自动将元素排序.两者不同处在于multiset允许元素重复而set不允许. 一.集和多集(set 和multiset 容器类) 在使用set和multis ...
- 【BZOJ2752】【线段树】高速公路
Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...
- openerp report image
webkit : 再mako 文件中插入以下代码, <% %>标签用于再mako中定义代码或者函数. 然后 ${ embed_image('图片类型', 图片字段 , 宽度,高度) } ...