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: ...
随机推荐
- Linux系统编程 —时序竞态
时序竞态 什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的.但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态. pause函 ...
- 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则
080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...
- 【优化】单调队列与dp
笔者大概看了一下单调队列对于DP的优化,故撰此文,望有帮助. (dp还是推式子难啊qwq) 例题1. 题目大意:在n个数的序列中,选择数字,使得其连续不超过k个数,且和最大. 本题的方程相对好推:设d ...
- 6-kubernetes网络
1.service存在的意义 防止破的失联(服务发现) 定义一组pod的访问策略(提供负载均衡) 2.pod与service的关系 通过label-selector相关联 通过service实现pod ...
- 【转载】可能是世界上最牛逼的网站统计程序——Matomo
大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...
- mac电脑上安装appium报错:Failed at the appium-chromedriver@4.25.1 postinstall script.
mac电脑安装appium,装好node.js后,使用命令:npm install appium@1.18.0,安装appium,报如下错误 ``` ERR! errno1 ERR! appium-c ...
- mycat 单库分表实践
参考 https://blog.csdn.net/sq2006hjp/article/details/78732227 Mycat采用的水平拆分,不管是分库还是分表,都是水平拆分的.分库是指,把一个大 ...
- golang 进行grpc调用
参考https://blog.csdn.net/qq_32744005/article/details/105606383 go get google.golang.org/grpc go get - ...
- Git 看这一篇就够了
上一篇讲 Git 的文章发出来没想到效果特别好,很多读者都要求继续深入的写. 那今天齐姐简单讲下 Git 的实现原理,知其所以然才能知其然:并且梳理了日常最常用的 12 个命令,分为三大类分享给你. ...
- 实验二 C2C实践
实验二 C2C实践 [实验目的] 掌握网上购物的基本流程和C2C平台的运营 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网. (3).奥派电子商务应用软件 [知识准备] 本实验 ...