Description

\(3333\) 年,在银河系的某星球上, X军团和Y军团正在激烈地作战。在战斗的某一阶段,Y军团一共派遣了 \(N\) 个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为 \(A_i\) 。当一个巨型机器人的装甲值减少到 \(0\) 或者以下时,这个巨型机器人就被摧毁了。X军团有 \(M\) 个激光武器,其中第 \(i\) 个激光武器每秒可以削减一个巨型机器人 \(B_i\) 的装甲值。激光武器的攻击是连续的。这种激光武器非常奇怪,一个激光武器只能攻击一些特定的敌人。Y军团看到自己的巨型机器人被X军团一个一个消灭,他们急需下达更多的指令。为了这个目标,Y军团需要知道X军团最少需要用多长时间才能将Y军团的所有巨型机器人摧毁。但是他们不会计算这个问题,因此向你求助。

Input

第一行,两个整数, \(N,M\) 。
第二行,\(N\) 个整数,\(A_1,A_2…A_N\)。
第三行,\(M\) 个整数,\(B_1,B_2…B_M\)。
接下来的 \(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\le N, M\le 50,1\le A_i\le 10^5,1\le B_i\le 1000\) ,输入数据保证X军团一定能摧毁Y军团的所有巨型机器人

Solution

azi只会做傻逼题
二分+最大流
每次二分一个答案 \(x\) ,如下重新建图:

  • \(S\) 往每个武器连边,流量为 \(x\times B_i\)
  • 每个怪兽往 \(T\) 连边,流量为 \(A_i\)
  • 如果武器 \(i\) 可以攻击怪兽 \(j\) ,\(i\) 往 \(j\) 连边,流量为 \(INF\)
#include<bits/stdc++.h>
using namespace std;#define N 1000
#define eps (1e-9)
#define INF (1e9)
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define lb long doubleinline int read() {int x = 0, flag = 1; char ch = getchar(); while (!isdigit(ch)) { if (!(ch ^ '-')) flag = -1; ch = getchar(); }while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); return x * flag;
}inline void write(int x) {if (!x) { putchar('0'); return; } if (x < 0) putchar('-'), x = -x;char buf[20] = ""; int top = 0; while (x) buf[++top] = x % 10 + '0', x /= 10; while (top) putchar(buf[top--]);
}int n, m;
int A[N], B[N], sum;
struct edge { int v, next; lb c; }e[1000005];
int head[N], tot, S, T;
bool Map[N][N];
int dep[N], q[N];inline void add(int u, int v, lb c) {e[++tot] = edge{ v, head[u], c }; head[u] = tot;e[++tot] = edge{ u, head[v], 0 }; head[v] = tot;
}inline bool bfs() {int l = 1, r = 1;memset(dep, 0, sizeof dep); q[r] = S, dep[S] = 1;while (l <= r) {int u = q[l++];for (int i = head[u]; i; i = e[i].next) {int v = e[i].v; lb c = e[i].c;if (c < eps || dep[v]) continue;dep[v] = dep[u] + 1, q[++r] = v;if (v == T) return 1;}}return 0;
}double dfs(int u, lb dis) {if (!(u ^ T) || dis < eps) return dis;for (int i = head[u]; i; i = e[i].next) {int v = e[i].v; lb c = e[i].c;if ((dep[v] ^ dep[u] + 1) || c < eps) continue;lb d = dfs(v, min(dis, c));if (d < eps) continue;e[i].c -= d, e[i ^ 1].c += d;return d;}return 0.0;
}bool check(lb x) {memset(head, 0, sizeof head); tot = 1;rep(i, 1, m) add(S, i, x * B[i]);rep(i, 1, n) add(i + m, T, A[i]);rep(i, 1, m) rep(j, 1, n) if (Map[i][j]) add(i, j + m, INF);lb ans = 0.0;while (bfs()) ans += dfs(S, INF);return fabs(ans - sum) < eps;
}int main() {scanf("%d%d", &n, &m); T = n + m + 1;rep(i, 1, n) A[i] = read(), sum += A[i];rep(i, 1, m) B[i] = read();rep(i, 1, m) rep(j, 1, n) Map[i][j] = read();lb l = 0.0, r = sum * 1.0;while (l + 1e-4 < r) { lb mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid; }printf("%.4lf", (double)l);return 0;
}

转载于:https://www.cnblogs.com/aziint/p/8416465.html

bzoj3993 [SDOI2015]星际战争相关推荐

  1. BZOJ3993: [SDOI2015]星际战争

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

  2. bzoj3993: [SDOI2015]星际战争(二分+最大流)

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

  3. bzoj3993 [SDOI2015]星际战争 二分答案+网络流检验

    流量分配模型. 这个题如果时间不知道的话流量是未知的,对于流量未知的网络流肯定是没法做的(没有动态借流量的网络流) 由于时间上满足连续性,就可以二分答案,然后流量确定就可以跑网络流 主要还是化静为动 ...

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

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

  5. [SDOI2015]星际战争

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

  6. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  7. P3324 [SDOI2015]星际战争

    传送门:https://www.luogu.org/problemnew/show/P3324 首先瞅一眼数据范围,发现m, n都很小,所以就可以初步断定这是一道网络流的题. 因为题中说每一个武器只能 ...

  8. 【BZOJ3993】 星际战争

    Time Limit: 1000 ms   Memory Limit: 128 MB Description  3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一 ...

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

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

最新文章

  1. .net 导出excel和word
  2. 逻辑回归模型(Logistic Regression, LR)基础
  3. EOS账户系统(1)场景
  4. EasyUI中进度条的简单使用
  5. java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?
  6. 阅读之spring+Dubbo
  7. extjs 验证消息不显示
  8. Mybatis异常_02_Result Maps collection already contains value for
  9. excel如何做出弧形_人民日报同款海报,只用线和字就能做出高大上的工作报告...
  10. [leetcode]100.Same Tree
  11. sata 双硬盘 电源线_电脑双硬盘安装图解教程
  12. 数据结构(C#版本)_基本概念及线性表
  13. 宏睿达智慧酒店云桌面系统远程控制台V4.1.4及前端桌面app V2.0.3支持直播的组播和单播格式、私密投屏、点播、周边、wifi管理、广告推送、多级管理、多主题管理
  14. python批量解压文件_Python 批量解压ZIP和RAR压缩文件(循环验证密码)
  15. 安装SHARP MX-3618NC PCL6打印机驱动程序
  16. ligerui combobox ajax,LigerUI中使用ligerComboBox生成多选下拉框
  17. 转载:虚拟机安装centos6.5出现 unsupported hardware detected 解决方法
  18. 移动终端应用开发上机3组件通信与广播
  19. 【阶段一】菜学21.11
  20. 计算机基础知识试题答案6,计算机基础知识试题及答案

热门文章

  1. kalman滤波(二)---扩展kalman滤波[EKF]的推导
  2. 13 vue学习 package.json
  3. 10分钟内把永远跑不完的存储过程变为2秒跑完
  4. 关于git经常忘记的:远程仓库关联。
  5. android 类加载器 DexClassLoader的用法,以及引出的插件架构
  6. Ubuntu 出现apt-get: Package has no installation candidate问题
  7. js 宽窄屏切换效果代码优化
  8. IOS开发-地图 (mapkit)实验
  9. Go 读取 yaml 文件并解析
  10. php kafka 日志系统,kafka-PHP客户端库(Composer)