3993: [SDOI2015]星际战争

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 1069  Solved: 489
[Submit][Status][Discuss]

Description

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军团的所有巨型机器人

Source

Round 1 感谢yts1999上传

[Submit][Status][Discuss]



显然,如果答案为xs,那么在这段时间内每门激光炮一定是持续输出答案才能最优

考虑二分最终答案,那么每门激光炮能输出的伤害也就固定了,最大流验证即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<bitset>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;const int maxm = 2E5 + 20;
typedef double DB;
const DB eps = 1E-5;
const DB EPS = 1E-8;
const DB INF = 1E12;struct E{int to; DB cap,flow; E(){}E(int to,DB cap,DB flow): to(to),cap(cap),flow(flow){}
}edgs[maxm];int n,m,s,t,cnt,cur[200],L[200],G[55][55];
DB tot,A[55],B[55];vector <int> v[200];
queue <int> Q;bool judge(const DB &x,const DB &y) {return fabs(x - y) <= EPS;}
void Add(int x,int y,DB cap)
{v[x].push_back(cnt); edgs[cnt++] = E(y,cap,0);v[y].push_back(cnt); edgs[cnt++] = E(x,0,0);
}bool BFS()
{for (int i = s; i <= t; i++) L[i] = 0;L[s] = 1; Q.push(s);while (!Q.empty()){int k = Q.front(); Q.pop();for (int i = 0; i < v[k].size(); i++){E e = edgs[v[k][i]];if (L[e.to] || judge(e.cap,e.flow)) continue;L[e.to] = L[k] + 1; Q.push(e.to);}}return L[t];
}DB Dinic(int x,DB a)
{if (x == t) return a; DB flow = 0;for (int &i = cur[x]; i < v[x].size(); i++){E &e = edgs[v[x][i]];if (L[e.to] != L[x] + 1 || judge(e.cap,e.flow)) continue;DB f = Dinic(e.to,min(a,e.cap - e.flow));if (judge(f,0.00)) continue; flow += f; e.flow += f;edgs[v[x][i]^1].flow -= f; a -= f;if (judge(a,0.00)) return flow;}if (judge(flow,0.00)) L[x] = -1; return flow;
}bool Judge(DB now)
{for (int i = 1; i <= m; i++) Add(s,i,now * B[i]);for (int i = 1; i <= n; i++) Add(i + m,t,A[i]);for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (G[i][j]) Add(i,j + m,INF);DB MaxFlow = 0;while (BFS()){for (int i = s; i <= t; i++) cur[i] = 0;MaxFlow += Dinic(s,INF);}for (int i = s; i <= t; i++) v[i].clear();cnt = 0; return judge(MaxFlow,tot);
}int main()
{#ifdef DMCfreopen("DMC.txt","r",stdin);#endifcin >> n >> m; s = 0; t = n + m + 1;for (int i = 1; i <= n; i++) scanf("%lf",&A[i]),tot += A[i];for (int i = 1; i <= m; i++) scanf("%lf",&B[i]);for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++) scanf("%d",&G[i][j]);DB l = 0,r = 1E8;while (r - l > eps){DB mid = (l + r) / 2.00;if (Judge(mid)) r = mid; else l = mid;}printf("%.8f\n",(l + r) / 2.00);return 0;
}

3993: [SDOI2015]星际战争相关推荐

  1. BZOJ3993: [SDOI2015]星际战争

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

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

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

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

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

  4. bzoj3993 [SDOI2015]星际战争

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

  5. [SDOI2015]星际战争

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

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

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

  7. 【BZOJ - 3993】星际战争(网络流最大流+二分)

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

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

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

  9. P3324 [SDOI2015]星际战争

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

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

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

最新文章

  1. jetty作为内嵌服务器自启动
  2. 分布式架构的对比-IBM XIV
  3. 热门云服务超87GB电子邮箱和密码泄露,黑客已验证大部分数据
  4. android Run模式也会出现Waiting for debugger的解决方法
  5. PostgreSQL数据库数组相似度计算
  6. itextpdf添加表格元素_使用iText填充pdf表单
  7. 如歌将两个数组合并_腾讯50题---合并两个有序数组
  8. eclipse的简介安装与配置
  9. Linux内核深入理解中断和异常(3):异常处理的实现(X86_TRAP_xx)
  10. 甘特图制作_甘特图是用什么软件制作?
  11. 解决办法:undefined reference to symbol 'shm_open@@GLIBC_2.2.5'
  12. Mysql复合索引的顺序和必要值
  13. 网络控制系统分析与设计——时延问题的网络控制系统建模
  14. 现当代英国童话小说传统对幻想文学创作的启示
  15. 人人商城互动直播(与通信服务器连接失败)
  16. 北京交通大学本科毕业论文答辩PPT模板
  17. 字符串是否为空(isEmpty和isBlank的区别)
  18. UBUNTU无ROOT权限解决“Could not resolve hostname XXXXX: Name or service not known“问题
  19. Ag Grid 表格树 Vue Data Grid: Tree Data
  20. 万字精华总结RocketMQ的常见用法(案例+图)

热门文章

  1. 【Python学习】基于pytorch和pysimplegui实现中国人口预测算法部署
  2. 物联网系统网关开发与实现
  3. 【前端知识之JS】reduce()方法与使用
  4. python爬虫豆瓣评论_Python爬虫实战:分析《战狼2》豆瓣影评
  5. CentOS Linux自动备份文件按日期备份
  6. 【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边
  7. 网站广告的盈利模式详解
  8. 树莓派运行yolo fastest启用bf16加速
  9. html+css制作月亮
  10. 痛并快乐着,我的程序世界