Luogu P3324 [SDOI2015]星际战争
二分+最大流
首先考虑二分答案
然后可以发现对于已知时间,判断是否可以将所有机器人摧毁可以用网络流
建立源点和汇点,源点向每一个激光武器连一条容量为$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]星际战争的更多相关文章
- BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)
字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...
- 洛谷P3324 [SDOI2015]星际战争
题目:洛谷P3324 [SDOI2015]星际战争 思路: 类似<导弹防御塔>,因为题目保证有解,花费时间小于最终答案时一定无法消灭所有敌人,只要花费时间大于等于最终答案都可以消灭所有敌人 ...
- P3324 [SDOI2015]星际战争
传送门:https://www.luogu.org/problemnew/show/P3324 首先瞅一眼数据范围,发现m, n都很小,所以就可以初步断定这是一道网络流的题. 因为题中说每一个武器只能 ...
- 洛谷P3324 [SDOI2015]星际战争 题解
题目链接: https://www.luogu.org/problemnew/show/P3324 分析: 因为本题的时间点较多,不能枚举,但发现有单调性,于是二分答案,二分使用的时间TTT 每个攻击 ...
- 洛谷$P3324\ [SDOI2015]$星际战争 网络流+二分
正解:网络流+二分 解题报告: 传送门$QwQ$ 其实我第一反应是费用流来着,,,但是仔细想了下发现我不会实现各个武器之间独立同时?而且攻击是连续的答案可能是小数嘛$QwQ$. 所以显然不是递推就二分 ...
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...
- BZOJ_3993_[SDOI2015]星际战争_二分+网络流
BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...
- bzoj千题计划131:bzoj3993: [SDOI2015]星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...
- 3993: [SDOI2015]星际战争
3993: [SDOI2015]星际战争 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1244 Solved: ...
随机推荐
- windows10开机后恢复关机前打开的chrome网页
开始-设置-账户-登录选项-隐私,下面一个"更新或重启后--"即第二个开关打开. 这时,无论是重启.更新重启或关机后开机,均可恢复原关机时的网页(和应用). 注:题主安装的wind ...
- 04 C语言基本语法
C语言的令牌 C 语言的程序代码由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下方的C语句包括5个令牌: printf("Hello, World! \n& ...
- C++中try&catch
参考: https://blog.csdn.net/xueluowutong/article/details/81257654 在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在 ...
- MYSQL 50 基础题 (转载)
MYSQL 50 基础题 (转载) 前言:最近在强化MYSQL 能力 答案在(也是转载处) https://www.cnblogs.com/kangxinxin/p/11585935.html 下面是 ...
- 教你怎么在thinkphp 5.1下查看版本号
在thinkphp 5.1下查看版本号,可直接命令行下面 php think version,就可以查看到tp具体的版本号了.
- node-macaddress
下载 node-macaddressnode-macaddress 检索Linux.OS X和Windows中的MAC地址. 关于MAC地址的一个常见误解是,每个主机只有一个MAC地址, 虽然一个主机 ...
- 透视HTTPS建造固若金汤的城堡
为什么有 HTTPS?因为 HTTP 不安全! 现在的互联网已经不再是 "田园时代","黑暗森林" 已经到来.上网的记录会被轻易截获,网站是否真实也无法验证,黑 ...
- .NET Standard 类库的使用技巧
系列目录 [已更新最新开发文章,点击查看详细] 在前一篇博客<.NET Standard中配置TargetFrameworks输出多版本类库>中详细介绍了如何创建.配置.条件编译. ...
- 多测师讲解python __for 循环___高级讲师肖sir
横向输出 1.遍历字符串 2.遍历列表 3.遍历元组 方法一: 方法二: 方法三: #循环字典:方法一# dict1={"name":"zhihao",&quo ...
- 自定义 Spring Boot Starter
关于Starter Spring Boot秉承"约定大于配置"的开发方式,使得我们基于Spring Boot开发项目的效率变得十分高.相信使用过Spring Boot的小伙伴都会发 ...