题目描述
3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战。

在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai。当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机器人就被摧毁了。

X军团有M个激光武器,其中第i个激光武器每秒可以削减一个巨型机器人Bi的装甲值。激光武器的攻击是连续的。

这种激光武器非常奇怪,一个激光武器只能攻击一些特定的敌人。Y军团看到自己的巨型机器人被X军团一个一个消灭,他们急需下达更多的指令。

为了这个目标,Y军团需要知道X军团最少需要用多长时间才能将Y军团的所有巨型机器人摧毁。但是他们不会计算这个问题,因此向你求助。

输入格式
第一行,两个整数,N、M。第二行,N个整数,A1、A2…AN。第三行,M个整数,B1、B2…BM。接下来的M行,每行N个整数,这些整数均为0或者1。这部分中的第i行的第j个整数为0表示第i个激光武器不可以攻击第j个巨型机器人,为1表示第i个激光武器可以攻击第j个巨型机器人。

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

输入输出样例
输入 #1
2 2
3 10
4 6
0 1
1 1
输出 #1
1.300000
说明/提示
【样例说明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<=10001<=N, M<=50,1<=Ai<=10^5,1<=Bi<=10001<=N,M<=50,1<=Ai<=105,1<=Bi<=1000,输入数据保证X军团一定能摧毁Y军团的所有巨型机器人。

分析:
考虑二分答案,然后相当于每个激光可以造成mid∗b[i]mid*b[i]mid∗b[i]的伤害。所以源点向激光连mid∗b[i]mid*b[i]mid∗b[i]的边,激光向可以被其摧毁的机器人连infinfinf的边,机器人向汇点连等同于其装甲值的边。如果最大流为装甲值之和,即可以实现题目要求。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#define LL long longconst int maxe=20007;
const int maxn=207;
const LL inf=1e14;using namespace std;int n,m,cnt,s,t,opt;
LL l,r,ans,sum;
int a[maxn],b[maxn],ls[maxn],dis[maxn];struct edge{int y,op,next;LL w;
}g[maxe];queue <int> q;void add(int x,int y,LL w)
{g[++cnt]=(edge){y,cnt+1,ls[x],w};ls[x]=cnt;g[++cnt]=(edge){x,cnt-1,ls[y],0};ls[y]=cnt;
}void rebuild()
{for (int i=1;i<=cnt;i+=2){g[i].w=g[i].w+g[i+1].w;g[i+1].w=0;}
}bool bfs()
{for (int i=s;i<=t;i++) dis[i]=0x3f3f3f3f;while (!q.empty()) q.pop();dis[s]=0;q.push(s);while (!q.empty()){int x=q.front();q.pop();for (int i=ls[x];i>0;i=g[i].next){int y=g[i].y;if ((g[i].w) && (dis[y]>dis[x]+1)){dis[y]=dis[x]+1;if (y==t) return true;q.push(y);}}}return false;
}LL dfs(int x,LL maxf)
{if ((x==t) || (!maxf)) return maxf;LL ret=0;for (int i=ls[x];i>0;i=g[i].next){int y=g[i].y;if ((g[i].w) && (dis[y]==dis[x]+1)){LL f=dfs(y,min(maxf-ret,g[i].w));if (!f) dis[y]=-1;g[i].w-=f;g[g[i].op].w+=f;ret+=f;if (ret==maxf) break;}}return ret;
}LL dinic()
{LL maxflow=0; while (bfs()) maxflow+=dfs(s,inf);return maxflow;
}int main()
{scanf("%d%d",&n,&m);s=0,t=n+m+1;for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=m;i++) scanf("%d",&b[i]);for (int i=1;i<=m;i++) add(s,i,0);for (int i=1;i<=n;i++){add(i+m,t,(LL)a[i]*10000);sum+=(LL)a[i]*10000;}for (int i=1;i<=m;i++){for (int j=1;j<=n;j++){scanf("%d",&opt);if (opt==1) add(i,j+m,inf);}}     LL l=1,r=1e8;while (l<=r){LL mid=(l+r)/2;rebuild();for (int i=1;i<=m;i++) g[i*2-1].w=(LL)mid*(LL)b[i];if (dinic()==sum) ans=mid,r=mid-1;else l=mid+1;}printf("%.3lf",(double)ans/10000);
}

洛谷 P3324 [SDOI2015]星际战争 二分答案+网络流相关推荐

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

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

  2. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

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

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

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

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

  5. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

  6. 洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)

    题目链接:https://www.luogu.org/problemnew/show/P1824 题目描述 Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚, ...

  7. 洛谷P1902 刺杀大使(二分答案+bfs验证)

    题目描述 伊朗伊斯兰革命卫队(某恐怖组织)正在策划一起刺杀行动,他们的目标是沙特驻美大 使朱拜尔.他们来到了沙特驻美使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前 的防御迷阵. 迷阵由 n*m ...

  8. [洛谷1462 ]通往奥格瑞玛的道路---二分答案+spfa

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  9. P3324 [SDOI2015]星际战争

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

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

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

最新文章

  1. linux go 安装
  2. 快拿走这份千字秘笈:3招量化促销活动结果,新零售营销得这么做
  3. C#笔记(二):委托与事件
  4. boost::lambda模块实现右值测试
  5. ArcGIS案例学习笔记-找出最近距离的垂线
  6. Android Studio Gradle构建脚本
  7. CodeForces - 540D Bad Luck Island —— 求概率
  8. 系统延时任务及定时任务
  9. 优化 WordPress 后台设置教程
  10. STL——配接器(adapters)
  11. Google Chrome谷歌浏览器中安装JsonView插件实现json数据转码、缩进、格式化的方法
  12. 天气预报小程序 微信小程序期末大作业(含文档)
  13. 拍牌服务器提交中断,沪牌拍牌的经验总结
  14. Linux驱动开发系列之一:Ubuntu 8.10下编译Linux kernel 2.6.32.1
  15. 严重:init datasource errorcom.mysql.jdbc.exceptions.jdb4.CommunicationsException:Communications link失败
  16. Oracle OCP 11g 常见单词(不定期更新)
  17. 如何写一篇科技论文(Luca Oerregrini)
  18. Java的正确使用方式
  19. Qt动画之仿Win8 Metro主界面
  20. Python+Vue计算机毕业设计高考填报志愿综合参考系统1kc8i(源码+程序+LW+部署)

热门文章

  1. hdu5208 Where is Bob 数位dp
  2. 马斯克、李彦宏、姚期智等云端纵论AI,他们都说了什么?
  3. JasperReport那些事儿(五)——再说表格式报表
  4. 常见的http状态码以及https的通讯过程和DNS的解析过程
  5. mysql choose when_mybatis使用choose when
  6. eemd的r语言序列_EEMD详解
  7. leetcode--728.自除数
  8. 7个步骤!3分钟!轻松绘制简单好看的折线图!
  9. 竖流式沉淀池集水槽设计计算_竖流沉淀池设计计算书.
  10. 如何做出 胜过 万龙洲海鲜的 双味腊肠芋头煲