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: ...
随机推荐
- java转python代码
今天发现一个好玩的工具:可以直接将java转成python 1. 安装工具(windows 环境下面) 先下载antlr: http://www.antlr3.org/download/antlr-3 ...
- Python实现的数据结构与算法之基本搜索详解
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分 ...
- Java 使用UDP传输一个小文本文件
工具1:Eclipse 工具2:IntelliJ IDEA Java工程的目录结构(基于IntelliJ IDEA) 例1.1:接收方,因为接收到的数据是字节流,为了方便,这里是基于Apache co ...
- Sprign-mvc系列之Spring快速入门 什么是sprign-mvc spring-mvc的作用及其基本使用+组件解析+注解解析
Spring-mvc 什么是SpringMvc SpringMvc是一种基于java的实现Mvc设计模式的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spr ...
- Oracle 正确删除归档日志的方法
我们都知道在controlfile中记录着每一个archivelog文件的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的controlfile中仍然记录着这些archivelog文件 ...
- 使用appium后安卓手机无法调出键盘解决方法
问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘. 原因:appium调试时,将手机输入法设置成了Unicode IME 解决方法: 方法一,手机设置里修改输入法: 不同的手 ...
- MeteoInfoLab脚本示例:Hamawari-8 netCDF data
示例数据:ftp://ftp.bom.gov.au/anon/sample/catalogue/Satellite/IDE00220.201507140300.nc 该数据的分辨率很高(22000*2 ...
- C++中线程安全单例模式的正确实现方式
为什么说DCLP不是线程安全的 DCLP(Double Checked Locking Pattern),即双检锁模式: class Foo { public: static Foo* getInst ...
- java 环境变量配置(win10)
到官网下载jdk,链接https://www.oracle.com/technetwork/java/javase/downloads/index.html 安装好,进行环境变量配置,打开环境变量 1 ...
- RHEL8和CentOS8怎么重启网络
本文主要讲解如何重启RHEL 8或者CentOS 8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL 8或者 CentOS 8,重启启动网络时,会出现以下报错 ...