题干:

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。

接下来的M行,每行N个整数,这些整数均为0或者1。这部分中的第i行的第j个整数为0表示第i个激光武器不可以攻击第j个巨型机器人,为1表示第i个激光武器可以攻击第j个巨型机器人。

Output

一行,一个实数,表示X军团要摧毁Y军团的所有巨型机器人最少需要的时间。输出结果与标准答案的绝对误差不超过10-3即视为正确。

Sample Input

2 2 3 10 4 6 0 1 1 1

Sample Output

1.300000

Hint

【样例说明1】

战斗开始后的前0.5秒,激光武器1攻击2号巨型机器人,激光武器2攻击1号巨型机器人。1号巨型机器人被完全摧毁,2号巨型机器人还剩余8的装甲值;

接下来的0.8秒,激光武器1、2同时攻击2号巨型机器人。2号巨型机器人被完全摧毁。

对于全部的数据,1<=N, M<=50,1<=Ai<=105,1<=Bi<=1000,输入数据保证X军团一定能摧毁Y军团的所有巨型机器人

解题报告:

二分时间,然后建图跑网络流。注意精度问题就行了。dfs中不能直接limit==0,而应该fabs(limit)

AC代码:

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const double eps = 1e-6;
int n,m;
int tot;
struct Edge {int to,ne;double w;
} e[100005 * 2];
int qq[55][55],a[55],b[55];
int head[10005];
int st,ed;
int dis[10050],q[10005];//一共多少个点跑bfs,dis数组和q数组就开多大。
void add(int u,int v,double w) {e[++tot].to=v;e[tot].w=w;e[tot].ne=head[u];head[u]=tot;
}
bool bfs(int st,int ed) {memset(dis,-1,sizeof(dis));int front=0,tail=0;q[tail++]=st;dis[st]=0;while(front<tail) {int cur = q[front];if(cur == ed) return 1;front++;for(int i = head[cur]; i!=-1; i = e[i].ne) {if(e[i].w > 0 &&dis[e[i].to]<0) {q[tail++]=e[i].to;dis[e[i].to]=dis[cur]+1;}}}if(dis[ed]==-1) return 0;return 1;
}
double dfs(int cur,double limit) {//limit为源点到这个点的路径上的最小边权 if(limit==0||cur==ed) return limit;double w,flow=0;for(int i = head[cur]; i!=-1; i = e[i].ne) {       if(e[i].w > 0&&dis[e[i].to]==dis[cur]+1) {w=dfs(e[i].to,min(limit,e[i].w));e[i].w-=w;e[i^1].w+=w;flow+=w;limit-=w;if(fabs(limit) == 0) break;}}if(!flow) dis[cur]=-1;return flow;
}
double dinic() {double ans = 0;while(bfs(st,ed)) ans+=dfs(st,0x7fffffff);return ans;
}
int main() {cin>>n>>m;st=0;ed=n+m+1;tot=1;int sum = 0;for(int i = 0; i<=ed; i++) head[i] = -1;for(int i = 1; i<=n; i++) scanf("%d",a+i),sum += a[i];for(int i = 1; i<=m; i++) scanf("%d",b+i);for(int i = 1; i<=m; i++) {for(int j = 1; j<=n; j++) {scanf("%d",&qq[i][j]);}}double l = 0,r = 100000,ans,mid;while(r-l>eps) {mid = (l+r)/2;for(int i = 0; i<=ed; i++) head[i] = -1;for(int i = 1; i<=m; i++) add(st,i,b[i]*mid),add(i,st,0);for(int i = 1; i<=n; i++) add(m+i,ed,a[i]),add(ed,m+i,0);for(int i = 1; i<=m; i++) {for(int j = 1; j<=n; j++) {if(qq[i][j]) add(i,j+m,0x7fffffff),add(j+m,i,0);}}if(fabs(dinic() - sum) < eps) r = mid,ans = mid;else l = mid;}printf("%.6f\n",ans);return 0;
}
//fabs(dinic() - sum) < eps

【BZOJ - 3993】星际战争(网络流最大流+二分)相关推荐

  1. bzoj 3993 星际战争 - 二分答案 - 最大流

    3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值减少到0或者 ...

  2. bzoj 3993 星际战争

    题目大意: X军团和Y军团正在激烈地作战  在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai 当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机 ...

  3. poj2112(网络流-最大流+二分)

    题意:给你k个挤奶器,c头牛,每个挤奶器能放m头牛,问你奶牛需要走的最大距离最小是多少: 解题思路:因为最大距离最小,也就是求最小的距离满足所有牛都能到,所以我们先用floyd跑最短路,把所有点之间的 ...

  4. 【BZOJ3993】[SDOI2015]星际战争 二分+最大流

    [BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...

  5. 【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流

    题目描述 Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的 ...

  6. BZOJ3993: [SDOI2015]星际战争

    BZOJ3993: [SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...

  7. 【Luogu-P3324 [SDOI2015] / DSY-1993】星际战争

    传送门:P3324 [SDOI2015]星际战争 二分 + 最大流 Solution\mathfrak{Solution}Solution 1 不可否认,看到题面的第一反应是构造二分图,让武器在一边, ...

  8. 图论-网络流⑦-费用流解题

    图论-网络流⑦-费用流解题 上一篇:图论-网络流⑥-费用流 下一篇:图论-网络流⑧-有上下界的网络流 参考文献: https://www.luogu.com.cn/blog/user9012/solu ...

  9. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

最新文章

  1. SAP SD微观研究之销售发票自动生成初探
  2. MySQL 复制 主键冲突
  3. MySQL权限管理-安全与效率的折中
  4. 跨链(5)“蚂蚁区块链”之跨链数据连接服务
  5. 符号化Symbol(符号)体系(转载)
  6. RocketMQ部署安装注意事项
  7. python专业名词_python 术语
  8. 获取png格式的MNIST数据集
  9. 【Gson】2.2.4 StackOverflowError 异常
  10. LRC歌词文件读取代码
  11. Why my APNs push certificate did not work?
  12. UE4联机多人游戏基本设置
  13. 低代码局中局:是IT革命还是高级外包? | 甲子光年
  14. Java正则表达式通过User-Agent获取IOS版本
  15. vSphere web client 虚拟机生成模板快速部署
  16. 三星S5P4418工控主板 (ARM Cortex-A9架构)
  17. codec基础知识的学习
  18. [Vue warn]: Unknown custom element: vhead - did you register the component correctly? For recursiv
  19. 提高服务器安全性能的方式
  20. 基于Python实现AutoCAD定数等分

热门文章

  1. 惊!MySQL官网巨变,下载被取消
  2. 打印机打印第一页的问题
  3. 第一课 回归问题与应用
  4. 拓扑排序两种实现方式
  5. 关于CNN的权重共享,CNN到底学到了什么?
  6. python3 unicode字符串_【已解决】Python3中如何声明字符串是unicode类型以避免log日志打印出错...
  7. 微星刀锋 无法进入bios_夏天来了 微星主板风扇转速调节攻略
  8. java如何保证类不被回收_垃圾回收机制保证了Java程序不会出现内存溢出。( )
  9. oracle 表达式1000,oracle环境下占用编号的方法报语法错误:ORA-01795: 列表中的最大表达式数为 1000...
  10. 谈谈对python这门课的认识_【Python公开课】1-认识Python