字符串终于告一段落了!

题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993

(luogu) https://www.luogu.org/problemnew/show/P3324

网络流从最水的开始做。。。

题解: 二分答案ans, 然后可以得到每个攻击者在ans时间内最多产生的总伤害,从起点往攻击者连边容量为此值,从每个攻击者往能攻击的防御者连边容量为\(+\inf\), 从每个防御者往终点连边边权为其装甲值,求最大流,判断其是否等于装甲值之和即可。

时间复杂度\(O(MaxFlow(n,n^2))\)

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;const int N = 102;
const int M = 2600;
const double INF = 1e7;
const double EPS = 1e-8;namespace MaxFlow
{struct Edge{int v,nxt,rev; double w;} e[(M<<1)+3];int fe[N+3];int te[N+3];int dep[N+3];int que[N+3];int n,en;void clear(){for(int i=1; i<=en; i++){e[i].v = e[i].nxt = e[i].rev = 0; e[i].w = 0.0;}for(int i=1; i<=n; i++) fe[i] = 0;n = en = 0;}void addedge(int u,int v,double w){en++; e[en].v = v; e[en].w = w;e[en].nxt = fe[u]; fe[u] = en; e[en].rev = en+1;en++; e[en].v = u; e[en].w = 0;e[en].nxt = fe[v]; fe[v] = en; e[en].rev = en-1;}bool bfs(){for(int i=1; i<=n; i++) dep[i] = 0;int head = 1,tail = 1; que[tail] = 1; dep[1] = 1;while(head<=tail){int u = que[head]; head++;for(int i=fe[u]; i; i=e[i].nxt){if(dep[e[i].v]==0 && e[i].w>EPS){dep[e[i].v] = dep[u]+1;tail++; que[tail] = e[i].v;}}}return dep[2]!=0;}double dfs(int u,double cur){if(u==2) return cur;double rst = cur;for(int i=te[u]; i; i=e[i].nxt){if(dep[e[i].v]==dep[u]+1 && e[i].w>0 && rst>0){double flow = dfs(e[i].v,min(rst,e[i].w));if(flow>EPS){rst -= flow; e[i].w -= flow; e[e[i].rev].w += flow;if(e[i].w>EPS) te[u] = i;if(rst==0) return cur;}}}if(abs(cur-rst)<EPS) dep[u] = 0;return cur-rst;}double dinic(int _n){n = _n;double ret = 0.0;while(bfs()){for(int i=1; i<=n; i++) te[i] = fe[i];ret += dfs(1,INF);}return ret;}
}int a[N+3],b[N+3];
int c[N+3][N+3];
int n,m;int main()
{scanf("%d%d",&n,&m); double std = 0.0;for(int i=1; i<=n; i++) {scanf("%d",&a[i]); std += (double)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",&c[i][j]);}double left = 0.0,right = INF;while(right-left>1e-5){double mid = (left+right)*0.5;MaxFlow::clear();for(int i=1; i<=m; i++){MaxFlow::addedge(1,i+2,mid*(double)b[i]);}for(int i=1; i<=n; i++){MaxFlow::addedge(i+m+2,2,(double)a[i]);}for(int i=1; i<=m; i++){for(int j=1; j<=n; j++){if(c[i][j]==1){MaxFlow::addedge(i+2,j+m+2,INF);}}}double ans = MaxFlow::dinic(m+n+2);if(abs(ans-std)<EPS){right = mid;}else{left = mid;}}printf("%.6lf\n",left);return 0;
}

BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)相关推荐

  1. P3324 [SDOI2015]星际战争

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

  2. BZOJ3993: [SDOI2015]星际战争

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

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

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

  4. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  5. [SDOI2015]星际战争

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

  6. bzoj3993 [SDOI2015]星际战争

    Description \(3333\) 年,在银河系的某星球上, X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了 \(N\) 个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装 ...

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

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

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

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

  9. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路: 转自:https://blog.csdn.net/u012288458 ...

最新文章

  1. 【两数之和】算法优化笔记
  2. SIFT算法原理(不带公式)
  3. aix oracle 10.2.0.1 升级 10.2.0.4,AIX Oracle RAC 升级到10.2.0.4.0要特别注意的问题 - 爱肯的专栏 ......
  4. linux基础命令-查看系统状态-free -m以及top命令详解
  5. 37.Linux/Unix 系统编程手册(下) -- DAEMON
  6. wchar_t 和 char
  7. 1.安装编译软件(keil)
  8. html json编辑器,JSON.html HTML Editor
  9. js读取excel,xlsx,xls 表格,转成JSON数据
  10. Java多线程电影院_java 多线程-快乐订座电影院
  11. [机器学习导论]——第三课——神经网络Ⅰ
  12. html5 粽子飘落,飘落的丁香花阅读*
  13. Linux内核配置蓝牙驱动,android bluetooth蓝牙移植,androidbluetooth
  14. JZOJ4809. 【NOIP2016提高A组五校联考1】挖金矿
  15. [转载]快速提高你修养的100句话,值得你珍藏
  16. java 实现ps功能_java 简单图片,可以实现ps的几个小滤镜
  17. 【有感】成为一个不惑、不忧、不惧的人
  18. 可爱猫咪,用 CSS 告诉你为何大橘为重!!
  19. 钢铁侠的原型,oracle的创始人,天才企业家—拉里·埃里森
  20. 09 | 不可或缺的自定义函数

热门文章

  1. VTK修炼之道25:图像基本操作_图像子块提取(特征区域提取)
  2. Linux常用实用命令
  3. 成员函数在外部调用的方式总结-函数指针强制绑定+lamda函数闭包行为实现this指针的绑定
  4. Cannot resolve symbol ‘NotBlank‘ Cannot resolve symbol ‘Email‘ Cannot resolve symbol ‘NotEmpty‘
  5. 使用贪心算法解决最小生成树问题。
  6. html中调用flex中的函数
  7. GNU C 中的零长数组
  8. Java数据类型转换(自动转换和强制转换)
  9. 【译】Notes on Blockchain Governance
  10. Android免Root环境下Hook框架Legend原理分析