首先我们可以二分答案。

假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验:

设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$;

设机器人为 $Y$,第 $i$ 个机器人的装甲为 $A_i$;

设 $Map[i][j]$ 表示第 $i$ 个机器人是否能攻击第 $j$ 号机器人。

设源为 $S$,汇为 $T$,现在考虑连边:

  • $S\rightarrow X_i$,容量为 $Ans * B_i$;
  • $Y_i\rightarrow T$,容量为 $A_i$;
  • $\forall (i,j),Map[i][j]=1:X_i\rightarrow Y_j$,容量为 $\infty$

然后跑网络流,假设最大流为 $M$,那么看是否有:$M=\sum A_i$。

如果是,那么说明当前答案是满足的,更新上界,否则更新下界。

毕竟 Gromah 太弱,只会做水题。

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long double LD;
#define N 50 + 5
#define M 100000 + 5
#define INF 1e9
#define eps 1e-9 int n, m, S, T, sum, tot;
int A[N], B[N];
int Head[N << ], q[N << ], Dfn[N << ];
bool Map[N][N];
LD l = 0.0, r; struct Edge
{
int next, node;
LD flow;
}h[M]; inline void addedge(int u, int v, LD fl)
{
h[++ tot].next = Head[u], Head[u] = tot;
h[tot].node = v, h[tot].flow = fl;
h[++ tot].next = Head[v], Head[v] = tot;
h[tot].node = u, h[tot].flow = ;
} inline bool BFS()
{
for (int i = S; i <= T; i ++)
Dfn[i] = ;
int l = , r = ;
q[] = S, Dfn[S] = ;
while (l <= r)
{
int z = q[l ++];
for (int i = Head[z]; i; i = h[i].next)
{
int d = h[i].node;
LD p = h[i].flow;
if (p < eps || Dfn[d]) continue ;
Dfn[d] = Dfn[z] + ;
q[++ r] = d;
if (d == T) return ;
}
}
return ;
} inline LD dinic(int z, LD inflow)
{
if (z == T || inflow < eps) return inflow;
LD ret = inflow, flow;
for (int i = Head[z]; i; i = h[i].next)
{
int d = h[i].node;
LD p = h[i].flow;
if (Dfn[d] != Dfn[z] + ) continue ;
flow = dinic(d, min(p, ret));
ret -= flow;
h[i].flow -= flow, h[i ^ ].flow += flow;
if (ret < eps) return inflow;
}
if (fabs(inflow - ret) < eps) Dfn[z] = -;
return inflow - ret;
} inline bool Judge(LD k)
{
tot = ;
for (int i = S; i <= T; i ++)
Head[i] = ;
for (int i = ; i <= m; i ++)
addedge(S, i, k * B[i]);
for (int i = ; i <= n; i ++)
addedge(i + m, T, A[i]);
for (int i = ; i <= m; i ++)
for (int j = ; j <= n; j ++)
if (Map[i][j]) addedge(i, j + m, INF);
LD res = 0.0;
while (BFS())
res += dinic(S, INF);
return fabs(res - sum) < eps;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3993.in", "r", stdin);
freopen("3993.out", "w", stdout);
#endif scanf("%d%d", &n, &m);
S = , T = n + m + ;
for (int i = ; i <= n; i ++)
{
scanf("%d", A + i);
r += A[i];
sum += 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", Map[i] + j);
while (l + 1e- < r)
{
LD mid = (l + r) / ;
if (Judge(mid)) r = mid;
else l = mid;
}
printf("%.4lf\n", (double) l); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}

3993_Gromah

BZOJ 3993 [SDOI 2015] 星际战争 解题报告的更多相关文章

  1. BZOJ 3992 [SDOI 2015] 序列统计 解题报告

    这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...

  2. [SDOI 2015] 星际战争

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3993 [算法] 首先发现问题具有单调性 , 不妨二分答案mid 考虑网络流 : 将源 ...

  3. BZOJ 4004 [JLOI 2015] 装备购买 解题报告

    哎这个题 WA 了无数遍...果然人太弱... 首先我们把这些装备按照花费从小到大排序,然后依次考虑是否能买这个装备. 至于这样为什么是对的,好像有一个叫拟阵的东西可以证明,然而我不会.TATQAQ ...

  4. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  5. BZOJ 3990 [SDOI 2015] 排序 解题报告

    这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...

  6. NOI 2015 滞后赛解题报告

    报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...

  7. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  8. 洛谷 P2245 星际导航 解题报告

    P2245 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向 ...

  9. 洛谷 P2469 [SDOI2010]星际竞速 解题报告

    题目描述 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一. 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其 ...

随机推荐

  1. [引]MSDN Visual Basic 和 C# 中都会用到的编程概念

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容   ...

  2. MySQL 에서 root 암호 변경하기

    먼저 터미널이나 SSH를 이용해 접속합니다. 그리고 리눅스 쉘상에서 다음과 같이 입력합니다. [mysqladmin을 이용한 암호변경] 형식) root계정]$mysqladmin -u ...

  3. orcale授权

    grant connect,resource,dba to 表名;--用户授权 CONNECT角色: --是授予最终用户的典型权利,最基本的 CREATE SESSION --建立会话 RESOURC ...

  4. 解决64位win7系统IIS7[ODBC 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序

    从网上下载了一个asp系统,数据库是Access类型的,运行环境为 64位Windows 7系统,IIS7,运行系统后,报如下错误: Microsoft OLE DB Provider for ODB ...

  5. ASP.NET Web Service如何工作(1)

    ASP.NET Web Service如何工作(1) [日期:2003-06-26] 来源:CSDN  作者:sunnyzhao(翻译) [字体:大 中 小] Summary ASP.NET Web ...

  6. ### 学习《C++ Primer》- 7

    Part 7: 重载运算与类型转换(第14章) // @author: gr // @date: 2015-01-08 // @email: forgerui@gmail.com 一.重载运算符要求 ...

  7. unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010

    1. UnitySetup-4.5.5.exe 官网下载最新版本4.X 安装exe文件 2. Unity 4.x Pro Patch.exe 复制exe到安装目录下 C:\Program Files ...

  8. cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类

    前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类  __String . 使用cocos2d::__Str ...

  9. Attribute (一)

    本文导读 1.概念 2.自定义一个 Attribute 概念       Attribute是一个特殊的类,我们知道 .NET 程序集 具有自描述的特性(由于元数据),Attribute和.NET的元 ...

  10. eclipse下的tomcat内存设置大小

    在eclipse中设置,居然可以了, 设置步骤如下: 1.点击eclipse上的debug图标旁边的下拉箭头 2.然后选择Run Configurations, 3.系统弹出设置tomcat配置页面, ...