二分+最大流

首先考虑二分答案

然后可以发现对于已知时间,判断是否可以将所有机器人摧毁可以用网络流

建立源点和汇点,源点向每一个激光武器连一条容量为$time*b[i]$的边,表示该激光武器在$time$时间下最多能产生的伤害为$time*b[i]$

每一个机器人向汇点连一条容量为$a[i]$的边,表示每一个机器人最多能承受的伤害

中间每一个激光武器向其能攻击的机器人连一条容量为$inf$的边

然后跑最大流,若可以跑出$\sum a[i]$,那么该时间可以将所有与机器人摧毁,更新二分边界

  1 #include <bits/stdc++.h>
2 #define inf 1e9
3 using namespace std;
4 const int N=210,M=6100;
5 int n,m,s,t,tot,first[N],nxt[M],point[M],nrl[N],d[N];
6 int vi[N][N];
7 double data[M],a[N],b[N],sum;
8 void add_edge(int x,int y,double z)
9 {
10 tot++;
11 nxt[tot]=first[x];
12 first[x]=tot;
13 point[tot]=y;
14 data[tot]=z;
15 tot++;
16 nxt[tot]=first[y];
17 first[y]=tot;
18 point[tot]=x;
19 data[tot]=0;
20 }
21 bool bfs()
22 {
23 queue <int> q;
24 for (int i=s;i<=t;i++)
25 {
26 d[i]=inf;
27 nrl[i]=first[i];
28 }
29 d[s]=0;q.push(s);
30 while (!q.empty())
31 {
32 int x=q.front();
33 q.pop();
34 for (int i=first[x];i!=-1;i=nxt[i])
35 {
36 int u=point[i];
37 if (data[i]>0 && d[u]>d[x]+1)
38 {
39 d[u]=d[x]+1;
40 if (u==t) return true;
41 q.push(u);
42 }
43 }
44 }
45 return false;
46 }
47 double dfs(int x,double flow)
48 {
49 if (x==t) return flow;
50 double sum=0;
51 for (int i=nrl[x];i!=-1;i=nxt[i])
52 {
53 int u=point[i];
54 if (data[i]>0 && d[u]==d[x]+1)
55 {
56 double tmp=dfs(u,min(flow,data[i]));
57 flow-=tmp;sum+=tmp;
58 data[i]-=tmp;data[i^1]+=tmp;
59 if (flow<=0) return sum;
60 }
61 nrl[x]=nxt[i];
62 }
63 return sum;
64 }//使用dinic跑最大流
65 bool check(double mid)
66 {
67 tot=-1;
68 memset(first,-1,sizeof(first));
69 memset(nxt,-1,sizeof(nxt));
70 s=0;t=n+m+1;//同上建边
71 for (int i=1;i<=m;i++) add_edge(s,i,mid*b[i]);
72 for (int i=1;i<=n;i++) add_edge(m+i,t,a[i]);
73 for (int i=1;i<=m;i++)
74 {
75 for (int j=1;j<=n;j++)
76 {
77 if (vi[i][j]) add_edge(i,m+j,inf);
78 }
79 }
80 double ans=0;
81 while (bfs()) ans+=dfs(s,inf);
82 return ans==sum;//判断是否跑满
83 }
84 int main()
85 {
86 scanf("%d%d",&n,&m);
87 for (int i=1;i<=n;i++) scanf("%lf",&a[i]);
88 for (int i=1;i<=m;i++) scanf("%lf",&b[i]);
89 for (int i=1;i<=m;i++)
90 {
91 for (int j=1;j<=n;j++)
92 scanf("%d",&vi[i][j]);
93 }
94 sum=0;
95 for (int i=1;i<=n;i++) sum+=a[i];
96 double l=0,r=1e8;
97 while ((r-l)>=1e-8)
98 {
99 double mid=(l+r)/2;
100 if (check(mid)) r=mid;
101 else l=mid;
102 }
103 printf("%.6lf\n",r);
104 }

Luogu P3324 [SDOI2015]星际战争的更多相关文章

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

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

  2. 洛谷P3324 [SDOI2015]星际战争

    题目:洛谷P3324 [SDOI2015]星际战争 思路: 类似<导弹防御塔>,因为题目保证有解,花费时间小于最终答案时一定无法消灭所有敌人,只要花费时间大于等于最终答案都可以消灭所有敌人 ...

  3. P3324 [SDOI2015]星际战争

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

  4. 洛谷P3324 [SDOI2015]星际战争 题解

    题目链接: https://www.luogu.org/problemnew/show/P3324 分析: 因为本题的时间点较多,不能枚举,但发现有单调性,于是二分答案,二分使用的时间TTT 每个攻击 ...

  5. 洛谷$P3324\ [SDOI2015]$星际战争 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 其实我第一反应是费用流来着,,,但是仔细想了下发现我不会实现各个武器之间独立同时?而且攻击是连续的答案可能是小数嘛$QwQ$. 所以显然不是递推就二分 ...

  6. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]

    3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...

  7. BZOJ_3993_[SDOI2015]星际战争_二分+网络流

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

  8. bzoj千题计划131:bzoj3993: [SDOI2015]星际战争

    http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...

  9. 3993: [SDOI2015]星际战争

    3993: [SDOI2015]星际战争 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1244  Solved: ...

随机推荐

  1. Pots(POJ - 3414)【BFS 寻找最短路+路径输出】

    Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...

  2. ASP。NET控件—控件如何相互关联

    介绍 这是我关于ASP系列的另一篇小文章.NET控件,它的主要焦点是揭示控件如何相互关联,涉及哪些实体,以及它们在此任务中的主要角色是什么. 动机 理解每次处理页面请求和某人在他的浏览器中获得您的we ...

  3. docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled

    故障描述: [root@docker01 ~]# docker run centos docker: Error response from daemon: Get https://registry- ...

  4. 机器学习算法——kNN(k-近邻算法)

    算法概述 通过测量不同特征值之间的距离进行 [分类] 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围: 数值型 和 标称型 . 算法流程 数据 样本数 ...

  5. ubuntu19.10如何设置固定ip

    $ip a 看见系统中有两块网卡 lo: ...... ens33: ...... #cd /etc/netplan$ls目录下面有文件01-network-manager-all.yaml $sud ...

  6. Oracle误操作 数据恢复

    SELECT * FROM v$sqlarea //查询最近sql记录 SELECT r.FIRST_LOAD_TIME,r.* FROM v$sqlarea r ORDER BY r.FIRST_L ...

  7. iot平台

    iot平台 iot平台卓岚云是一个免费的物联网云平台,用户只需按步骤完成注册即可免费使用卓岚云 .支持PC.Android.iOS多平台终端.用户可以在任何地方远程访问任何地方的串口设备,并对远程设备 ...

  8. PHP-fpm启动后没有查询到9000端口的问题

    Nginx与php-fpm通信的两种方式:tcp socket 和 Unix socket. Unix socket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.这种方式需要再ng ...

  9. Eclipse JSP +Tomcat 环境搭建 错误记录

    环境搭建请参考原文:https://www.cnblogs.com/james-lee/p/5964238.html 错误1:运行时,弹出如下错误:(如果没有此错误,请忽略) 原因是,我们之前点击了T ...

  10. Excel 导出的方法 之二

    // <summary> /// 导出到Excel lichenghu /// </summary> /// <param name="dt"> ...